var writer = PrintWriter("abc.txt")
writer.println("John")
writer.println("Emmy")
writer.println("Char")
writer.close()
var reader = File("abc.txt")
reader.forEachLine { println(it) }
但是如何将这些名称存储在地图中,例如john应该是键,Emmy应该是值
2 个答案:
您几乎拥有它:
val list = arrayListOf<String>()
val mapNames = hashMapOf<String, String>()
val reader = File("abc.txt")
reader.forEachLine { list.add(it) }
for (i in 1..list.size / 2) {
val key = list[2 * i - 2]
val value = list[2 * i - 1]
mapNames.put(key, value)
}
一种替代方法是使用功能更强的方法。
val writer = PrintWriter("abc.txt")
writer.println("John")
writer.println("Emmy")
writer.println("Char")
writer.close()
val reader = File("abc.txt")
val mapTruncated = reader.readLines().windowed(2, 2) {
it[0] to it[1]
}.toMap()
-> {John=Emmy}
readLines()
创建一个包含所有行的List<String>
。
windowed(2, 2)
遍历此列表,并为每次迭代访问2个元素。迭代后,它将当前索引增加2。如果它不是一个完整的窗口(给定键没有值),它将截断最后一行。
lambda变换{ it[0] to it[1] }
将类型List<String>
的窗口转换为Pair<String, String>
。
可以使用List<Pair<String, String>>
将结果列表(toMap()
)转换为地图。
如果要所有行并在最后一个键中填入例如。 null,您不能做这样的事情。
val mapComplete = reader.readLines().chunked(2) {
it[0] to it.getOrNull(1)
}.toMap()
-> {John=Emmy, Char=null}
chunked(2)
是windowed(2, 2, true)
的别名。最后一个参数true
表示它应包含部分窗口。