在 Kotlin 中存储字符串网格的最佳数据结构是什么?
What's the optimal data structure to store a String grid in Kotlin?
存储像这样的字符串网格的最佳数据结构是什么?如何将字符串简洁地转换为该数据类型?
"""10 15 20 11
14 19 04 10
18 63 92 68"""
我想通过使用一对坐标轻松访问网格中的任何数字。
您可以使用 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 and use it with 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)
在这种情况下,首先我们 split our string to separate numbers and get collection of strings List<String>
. And after this we chunk 这个列表得到 List<List<String>>
用法:
val grid = """10 15 20 11
14 19 04 10
18 63 92 68""".asGrid(4)
您可以使用 lineSequence and split 使用“”(space 定界符)的字符串按顺序读取每一行:
示例:
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) } }
在这里,您首先将输入拆分为多行(得到一个字符串列表),然后映射每个商店列表以按 space 拆分它们。然后你可以解析里面的每一个字符串,把它们解析成一个整数。这样的结果最后变成了一个list of list of integers.
您可能想要更改精确解析以支持更多选项(例如拆分为全白space)或解析为不同的类型。
存储像这样的字符串网格的最佳数据结构是什么?如何将字符串简洁地转换为该数据类型?
"""10 15 20 11
14 19 04 10
18 63 92 68"""
我想通过使用一对坐标轻松访问网格中的任何数字。
您可以使用 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 and use it with 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)
在这种情况下,首先我们 split our string to separate numbers and get collection of strings List<String>
. And after this we chunk 这个列表得到 List<List<String>>
用法:
val grid = """10 15 20 11
14 19 04 10
18 63 92 68""".asGrid(4)
您可以使用 lineSequence and split 使用“”(space 定界符)的字符串按顺序读取每一行:
示例:
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) } }
在这里,您首先将输入拆分为多行(得到一个字符串列表),然后映射每个商店列表以按 space 拆分它们。然后你可以解析里面的每一个字符串,把它们解析成一个整数。这样的结果最后变成了一个list of list of integers.
您可能想要更改精确解析以支持更多选项(例如拆分为全白space)或解析为不同的类型。