Kotlin如何正确向List<List<Map<String,String>>>类型变量插入数据并返回
问题根因
你得到非预期输出的核心原因是初始化可变列表时传入了多余的默认空结构:
- 你初始化
val a = mutableListOf(mutableListOf(mutableMapOf<String, String>()))时,已经往外层列表里插入了一个包含空Map的内层列表,这就是输出里第一个[{}]的来源 - 后续你初始化
val b = mutableListOf(mutableMapOf<String, String>())时,又给内层列表默认加了一个空Map,最终才会输出[[{}], [{}, {c=n}]]
正确的插入写法
你只需要初始化空的可变列表,不要传入默认的空结构即可:
// 初始化空的外层列表,无默认元素 val a = mutableListOf<List<Map<String, String>>>() // 初始化空的内层列表,无默认元素 val b = mutableListOf<Map<String, String>>() val c = mutableMapOf<String, String>() c["c"] = "n" b.add(c) a.add(b)
运行后输出结果为你预期的[[{c=n}]]。
关于你提供的processReport函数说明
你写的这个函数本身的初始化逻辑是正确的:val result = mutableListOf<List<Map<String, String>>>()创建的是空的外层列表,没有插入默认的空结构,循环内每次生成的record也是空的内层列表,只要你的CSV行解析逻辑没有问题,最终返回的就是符合List<List<Map<String, String>>>格式的结果。
如果你实际需求是每行对应一个Map(而不是每行对应一个包含N个单键Map的列表),可以把内层逻辑修改为:
while (file.hasNext()) { val record = mutableMapOf<String, String>() val rowValues = file.nextLine() .replace(",(?=[^\"]*\"[^\"]*(?:\"[^\"]*\"[^\"]*)*$)".toRegex(), "") .split(",") for (i in rowValues.indices) { record[columnNames[i]] = rowValues[i] } result.add(listOf(record)) }
内容的提问来源于stack exchange,提问作者Piyush Doke
相关产品推荐
相关产品推荐

