在 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)或解析为不同的类型。