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