主頁 > 軟體工程 > 以CSV格式讀取和存盤游戲狀態

以CSV格式讀取和存盤游戲狀態

2022-06-15 19:07:12 軟體工程

感謝Tenfour04 的大力幫助,我得到了處理 CSV 檔案的精彩代碼。

但是,我遇到了以下麻煩。

  1. 如何呼叫這些函式?
  2. 如何初始化二維陣列變數?

下面是最終作業的代碼。

MainActivity.kt

package com.surlofia.csv_tenfour04_1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import java.io.File
import java.io.IOException
import com.surlofia.csv_tenfour04_1.databinding.ActivityMainBinding

var chk_Q_Num: MutableList<Int> = mutableListOf  (
    0,
    1, 2, 3, 4, 5,
    6, 7, 8, 9, 10,
    11, 12, 13, 14, 15,
    16, 17, 18, 19, 20,
)

var chk_Q_State: MutableList<String> = mutableListOf  (
    "z",
    "a", "b", "c", "d", "e",
    "f", "g", "h", "i", "j"
)


class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // setContentView(R.layout.activity_main)

        binding = ActivityMainBinding.inflate(layoutInflater)

        val view = binding.root

        setContentView(view)

        // Load saved data at game startup. It will be invalid if performed by other activities.

        val filePath = filesDir.path   "/chk_Q.csv"
        val file = File(filePath)

        binding.fileExists.text = isFileExists(file).toString()

        if (isFileExists(file)) {
            val csvIN = file.readAsCSV()

            for (i in 0 .. 10) {
                chk_Q_Num[i] = csvIN[i][0].toInt()
                chk_Q_State[i] = csvIN[i][1]
            }

        }

        // Game Program Run


        val csvOUT = mutableListOf(
            mutableListOf("0","OK"),
            mutableListOf("1","OK"),
            mutableListOf("2","OK"),
            mutableListOf("3","Not yet"),
            mutableListOf("4","Not yet"),
            mutableListOf("5","Not yet"),
            mutableListOf("6","Not yet"),
            mutableListOf("7","Not yet"),
            mutableListOf("8","Not yet"),
            mutableListOf("9","Not yet"),
            mutableListOf("10","Not yet")
        )

        var tempString = ""

        for (i in 0 .. 10) {
            csvOUT[i][0] = chk_Q_Num[i].toString()
            csvOUT[i][1] = "OK"

            tempString = tempString   csvOUT[i][0]   "-->"   csvOUT[i][1]   "\n"
        }

        binding.readFile.text = tempString

        // and save Data
        file.writeAsCSV(csvOUT)


    }


    // https://www.techiedelight.com/ja/check-if-a-file-exists-in-kotlin/

    private fun isFileExists(file: File): Boolean {
        return file.exists() && !file.isDirectory
    }

    @Throws(IOException::class)
    fun File.readAsCSV(): List<List<String>> {
        val splitLines = mutableListOf<List<String>>()
        forEachLine {
            splitLines  = it.split(", ")
        }
        return splitLines
    }

    @Throws(IOException::class)
    fun File.writeAsCSV(values: List<List<String>>) {
        val csv = values.joinToString("\n") { line -> line.joinToString(", ") }
        writeText(csv)
    }
}

chk_Q.csv

0,0
1,OK
2,OK
3,Not yet
4,Not yet
5,Not yet
6,Not yet
7,Not yet
8,Not yet
9,Not yet
10,Not yet

1.如何呼叫這些函式?

下面的代碼似乎運行良好。我是否以正確的方式呼叫這些函式?還是有更好的方法來實作這一目標?

if (isFileExists(file)) {
    val csvIN = file.readAsCSV()

    for (i in 0 .. 10) {
        chk_Q_Num[i] = csvIN[i][0].toInt()
        chk_Q_State[i] = csvIN[i][1]
    }
}

file.writeAsCSV(csvOUT)

2、如何初始化二維陣列變數?

val csvOUT = mutableListOf(
    mutableListOf("0","OK"),
    mutableListOf("1","OK"),
    mutableListOf("2","OK"),
    mutableListOf("3","Not yet"),
    mutableListOf("4","Not yet"),
    mutableListOf("5","Not yet"),
    mutableListOf("6","Not yet"),
    mutableListOf("7","Not yet"),
    mutableListOf("8","Not yet"),
    mutableListOf("9","Not yet"),
    mutableListOf("10","Not yet")
)

我想知道使用 for 回圈而不是一個一個地撰寫特定值的聰明方法。

例如,像下面這樣。

val csvOUT = mutableListOf(mutableListOf())
for (i in 0 .. 10) {
    csvOUT[i][0] = i
    csvOUT[i][1] = "OK"
}

但這給了我以下錯誤訊息:

沒有足夠的資訊來推斷型別變數 T

如果您能提供一個如何為初學者執行此操作的示例,那就太好了。


----- 2022年6月15日添加。 ----- [問題1]關于初始化,執行以下代碼時出現錯誤“繼續停止”。應用程式被強制終止。為什么是這樣?

val csvOUT: MutableList<MutableList<String>> = mutableListOf(mutableListOf())
    for (i in 0 .. 10) {
        csvOUT[i][0] = "$i"
        csvOUT[i][1] = "OK"
    }

[錯誤資訊]

java.lang.RuntimeException:無法啟動活動 ComponentInfo{com.surlofia.csv_endzeit_01/com.surlofia.csv_endzeit_01.MainActivity}:java.lang.IndexOutOfBoundsException:索引:0,大小:0

uj5u.com熱心網友回復:

在我看來,您的問題基本上有兩個部分。首先,您需要了解 Kotlin 型別系統,包括泛型其次,您需要一些有關解決手頭問題的方法的知識。

型別系統和泛型

mutableListOf您使用的函式是通用的,因此需要一個型別引數,從檔案T中可以看出它的定義

fun <T> mutableListOf(): MutableList<T>

大多數時候,Kotlin 編譯器非常擅長型別推斷,即根據背景關系猜測使用的型別。例如,我不需要在以下示例中顯式提供型別,因為 Kotlin 編譯器可以從使用背景關系推斷型別。

val listWithInts = mutableListOf(3, 7)

推斷的型別是MutableList<Int>. 然而,有時這可能不是人們想要的。例如,我可能希望null在上面的串列中允許值。為了實作這一點,我必須告訴編譯器它不僅應該允許Int串列中的值,還應該允許值null,將型別從Intto擴大Int?我至少可以通過兩種方式實作這一目標。

  1. 提供泛型型別引數
val listWithNullableInts = mutableListOf<Int?>(3, 7)
  1. 明確定義預期的回傳型別
val listWithNullableInts: MutableList<Int?> = mutableListOf(3, 7)

在您的情況下,編譯器沒有足夠的資訊來從使用背景關系推斷型別。因此,您必須為其提供該背景關系,例如通過將特定型別的值傳遞給函式或使用上面提到的兩個選項之一。

多維陣列的初始化

StackOverflow 上已經有關于在 Kotlin 中創建多維陣列的問題和答案。

您手頭的問題的一種解決方案可能如下。

val csvOUT: MutableList<MutableList<String>> = mutableListOf(mutableListOf())

for (i in 0 .. 10) {
    csvOUT[i][0] = "$i"
    csvOUT[i][1] = "OK"
}

您通過顯式定義預期的回傳型別來幫助 Kotlin 編譯器,然后將值作為Strings 添加到您的 2D 串列中。

如果尺寸是固定的,您可能希望使用固定大小的Array來代替。

val csvArray = Array(11) { index -> arrayOf("$index", "OK") }

然而,在這兩種解決方案中,您都將Int索引轉換為 a String如果您要為每個級別存盤的唯一資訊是 a String,您不妨使用一個簡單的List<String并使用每個條目的索引作為級別編號,例如:

val csvOut = List(11) { "OK" }
val levelThree = csvOut[2] // first index of List is 0 

這也適用于更復雜的資料結構而不是Strings. 你只需要調整你fun File.writeAsCSV(values: List<List<String>>)的接受不同的型別作為values引數。假設一個簡單的資料類,您最終可能會得到以下內容:

data class LevelState(val state: String, val timeBeaten: Instant?)

val levelState = List(11) { LevelState("OK", Instant.now()) }

fun File.writeAsCSV(values: List<LevelState>) {
    val csvString = values
        .mapIndexed { index, levelState -> "$index, ${levelState.state}, ${levelState.timeBeaten}" }
        .joinToString("\n")
    
    writeText(csvString)
}

Array如果您更喜歡更“經典”的命令式方法,您可以List使用像for in.

val list: MutableList<MutableList<String>> = mutableListOf() // list is now []

for (i in 0..10) {
    val innerList = mutableListOf())
    innerList.add("$i")
    innerList.add("OK")
    innerList.add("${Instant.now()}")

    list.add(innerList) 
    // list is after first iteration [ ["0", "OK", "2022-06-15T07:03:14.315Z"] ]
}

該語法listName[index] = value只是運算子的運算子多載的語法糖,例如set,請參閱MutableList 上的檔案

您無法訪問之前未填充的索引,例如在串列初始化期間或使用add; 否則你會收到一個IndexOutOfBoundsException.

如果要使用set運算子,一種選擇是使用預先填充的陣列,如下所示:

val array: Array<Array<String>>> = Array(11) { 
    Array(3) { "default" }
} // array is [ ["default, "default", "default"], ...]

array[1][2] = "myValue"

但是,我不推薦這種方法,因為它可能會導致剩余的、可能無效的初始資料,以防錯過替換值。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/491262.html

標籤:CSV 科特林 多维数组 文件输入流 文件输出流

上一篇:如何在PowerShell中修復系統物件值

下一篇:發生例外時,JavaOptionalorElse無法回傳替代值

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more