在Kotlin中存储String网格的最佳数据结构是什么?

问题描述 投票:0回答:3

存储像这样的String网格的最佳数据结构是什么,以及如何将String简洁地转换为该数据类型?

"""10 15 20 11 14 19 04 10 18 63 92 68"""

我想通过使用一对坐标轻松访问网格中的任何数字。

kotlin grid coordinates access data-storage
3个回答
0
投票

您可以使用lineSequencesplit使用字符串“”(空格分隔符)按顺序读取每一行:

示例:

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]]

0
投票
grid.split("\n").map { line -> line.split(" ").map { nr -> Integer.parseInt(nr) } }

在这里,您首先将输入分成几行(得到一个字符串列表),然后映射每个商店列表以按空格将它们分开。然后,您可以解析其中的每个字符串,以将它们解析为整数。结果最后是整数列表。

您可能想要更改精确的解析以支持更多选项(例如,在所有空白处进行拆分)或解析为其他类型。


0
投票

您可以使用以下列表的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)
© www.soinside.com 2019 - 2024. All rights reserved.