【问题标题】:Kotlin Creating List<List<Map<String, String>>>Kotlin 创建列表<List<Map<String, String>>>
【发布时间】:2021-09-04 14:03:42
【问题描述】:

我正在尝试从 kotlin 中的函数返回 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

我正在尝试为其编写此 dat 结构的函数:

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
}

【问题讨论】:

    标签: kotlin arraylist data-structures collections


    【解决方案1】:

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

    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 所在的任何字符集。

    【讨论】:

    • 感谢您的回答。实际上我在循环中使用它,因此不能使用您建议的第一种方法:) 但这帮助我找到了正确的方向,因此我可以在列表和映射中正确插入数据而不会得到任何空条目。
    • 而不是使用循环和可变数据结构。您可以使用map 函数来做您想做的事。没有你的代码很难看到。 :)
    • 我添加了我尝试使用数据结构的函数。我看不出如何使用map 来避免循环。肯定想知道:-)
    • 啊,您正在解析 CSV。更新了答案。祝你好运;-)
    • 是的,CSV 解析器会自动处理这个问题,因为我在创建解析器时提供了 withHeader() 选项 - 它知道第一行提供键,当前行提供值。
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 2020-03-10
    • 2019-04-12
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2020-01-26
    相关资源
    最近更新 更多