Kotlin 创建列表<List<Map<String, String>>>

Kotlin Creating List<List<Map<String, String>>>

我正在尝试 return List>> 来自 kotlin 中的函数。我是科特林的新手。

编辑1

下面是我尝试这样做的方式

val a = mutableListOf(mutableListOf(mutableMapOf<String, String>()))

上述变量的问题是,我不知道如何将数据插入到这个变量中。我试过这个:

val a = mutableListOf(mutableListOf(mutableMapOf<String, String>()))
val b = mutableListOf(mutableMapOf<String, String>())
val c = mutableMapOf<String, String>()
c.put("c", "n")
b.add(c)
a.add(b)

这给了我:

[[{}], [{}, {c=n}]]

我要的是[[{c=n}]]

谁能告诉我如何向其中插入数据?

我想要实现的最终目标是以 List>>

的形式存储数据

编辑 2

我正在为其编写此数据结构的函数:

fun processReport(file: Scanner): MutableList<List<Map<String, String>>> {
    val result = mutableListOf<List<Map<String, String>>>()
    val columnNames = file.nextLine().split(",")
    while (file.hasNext()) {
        val record = mutableListOf<Map<String, String>>()
        val rowValues = file.nextLine()
            .replace(",(?=[^\"]*\"[^\"]*(?:\"[^\"]*\"[^\"]*)*$)".toRegex(), "")
            .split(",")
        for (i in rowValues.indices) {
            record.add(mapOf(columnNames[i] to rowValues[i]))
            print(columnNames[i] + " : " + rowValues[i] + "   ")
        }
        result.add(record)
    }
    return result
}

您不需要使用可变数据结构。你可以这样定义它:

fun main() {
    val a = listOf(listOf(mapOf("c" to "n")))
    println(a)
}

输出:

[[{c=n}]]

如果你想使用可变数据结构并在以后添加数据,你可以这样做:

fun main() {
    val map = mutableMapOf<String, String>()
    val innerList = mutableListOf<Map<String, String>>()
    val outerList = mutableListOf<List<Map<String, String>>>()

    map["c"] = "n"
    innerList.add(map)
    outerList.add(innerList)

    println(outerList)
}

尽管列表和映射是可变的,但输出是相同的。


回应第二次编辑。啊,你正在解析 CSV。你不应该自己尝试这样做,但你应该使用图书馆。这是一个使用 Apache Commons CSV

的示例
fun processReport(file: File): List<List<Map<String, String>>> {
    val parser = CSVParser.parse(file, Charset.defaultCharset(), CSVFormat.DEFAULT.withHeader())
    return parser.records.map {
        it.toMap().entries.map { (k, v) -> mapOf(k to v) }
    }
}

对于以下 CSV:

foo,bar,baz
a,b,c
1,2,3

它产生:

[[{foo=a}, {bar=b}, {baz=c}], [{foo=1}, {bar=2}, {baz=3}]]

请注意,如果您愿意返回地图列表,可以进一步简化它:

fun processReport(file: File): List<Map<String, String>> {
    val parser = CSVParser.parse(file, Charset.defaultCharset(), CSVFormat.DEFAULT.withHeader())
    return parser.records.map { it.toMap() }
}

输出:

[{foo=a, bar=b, baz=c}, {foo=1, bar=2, baz=3}]

我在这里使用 Charset.defaultCharset(),但您应该将其更改为 CSV 所在的任何字符集。