存储像这样的String网格的最佳数据结构是什么,以及如何将String简洁地转换为该数据类型?
"""10 15 20 11
14 19 04 10
18 63 92 68"""
我想通过使用一对坐标轻松访问网格中的任何数字。
您可以使用lineSequence和split使用字符串“”(空格分隔符)按顺序读取每一行:
示例:
val str =
"""
10 15 20 11
14 19 04 10
18 63 92 68
""".trimIndent() // remove extra indents.
val list = str.lineSequence()
.map { it.split(" ") /*.toInt()*/ } // performs intermediate operation (isn't done yet)
.toList() // performs terminal operation (performing map, and then convert to list)
println(list) // prints: [[10, 15, 20, 11], [14, 19, 04, 10], [18, 63, 92, 68]]
grid.split("\n").map { line -> line.split(" ").map { nr -> Integer.parseInt(nr) } }
在这里,您首先将输入分成几行(得到一个字符串列表),然后映射每个商店列表以按空格将它们分开。然后,您可以解析其中的每个字符串,以将它们解析为整数。结果最后是整数列表。
您可能想要更改精确的解析以支持更多选项(例如,在所有空白处进行拆分)或解析为其他类型。
您可以使用以下列表的list:
val grid: List<List<String>> = listOf(
listOf("10", "15", "20"),
listOf("14", "19", "04"),
listOf("18", "63", "92")
)
val elem = grid[1][1]
您还可以编写自己的extension function并将其与pairs一起使用:
fun List<List<String>>.get(i: Pair<Int, Int>) = this[i.first][i.second]
val element = grid.get(1 to 1)
更新
您可以使用此辅助函数从字符串创建列表列表:
fun String.asGrid(size: Int): List<List<String>> = split(" ", "\n").chunked(size)
用法:
val grid = """10 15 20 11
14 19 04 10
18 63 92 68""".asGrid(4)