【问题标题】:What's the optimal data structure to store a String grid in Kotlin?在 Kotlin 中存储字符串网格的最佳数据结构是什么?
【发布时间】:2020-06-09 07:37:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: kotlin grid coordinates data-storage


    【解决方案1】:

    您可以使用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]]
    

    【讨论】:

    • 感谢您的回答!不知道 lineSequence() 函数。看起来很有用。
    【解决方案2】:

    您可以使用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)
    

    在这种情况下,首先我们 split 我们的字符串来分隔数字并获取字符串集合 List&lt;String&gt;。在这之后我们chunk这个列表得到List&lt;List&lt;String&gt;&gt;

    用法:

    val grid = """10 15 20 11
                  14 19 04 10
                  18 63 92 68""".asGrid(4)
    

    【讨论】:

    • 感谢您的回答。我只是想说我的意图是以编程方式从字符串转换为您的列表列表。因为我知道 Kotlin 可以非常简洁,我只是不知道如何实现它。
    • 哇,它确实有效。不知道多参数 split() 函数和 chunked() 函数。非常干净的解决方案。谢谢!
    【解决方案3】:
    grid.split("\n").map { line -> line.split(" ").map { nr -> Integer.parseInt(nr) } }
    

    在这里,您首先将输入分成几行(得到一个字符串列表),然后映射每个商店列表以按空格分隔它们。然后你可以解析里面的每一个字符串,把它们解析成一个整数。这导致最后变成一个整数列表。

    您可能想要更改确切的解析以支持更多选项(例如拆分所有空格)或解析为不同的类型。

    【讨论】:

    • 谢谢! map() 函数似乎真的很有用。我试图使用 forEach() 函数来解决这个问题,但它实际上是我正在寻找的 map()。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多