【问题标题】:Kotlin: parsing a list of pairs delimited by parentheses into a list of Pairs()Kotlin:将由括号分隔的对列表解析为 Pairs() 列表
【发布时间】:2021-10-11 07:30:01
【问题描述】:

我还没有弄清楚如何使用 Kotlin 的 split 函数将这一系列边缘解析成 ListPairs

(2, 4), (3, 6), (5, 1), (8, 9), (10, 12), (11, 7)

我可以毫无问题地编写一个字符一个字符的解析器 - 但是这个解析问题有 Kotlin 解决方案吗?

【问题讨论】:

  • 数据的格式保证是这样还是需要在解析的时候验证?
  • 格式有保证 - 这是生物信息学课程的问题,而不是“野外数据”。

标签: kotlin parsing split coordinates edges


【解决方案1】:

Aleksei 的答案应该可以正常工作,尽管它没有给你数字。

另外,我宁愿这样写(分解成函数):

private fun String.parsePairs(): List<Pair<Int, Int>> = removePrefix("(")
    .removeSuffix(")")
    .split("), (")
    .map { it.parsePair() }

private fun String.parsePair(): Pair<Int, Int> =
    split(", ").let { it[0].toInt() to it[1].toInt() }

另一种选择是使用正则表达式。这里有点矫枉过正,但如果您有更复杂的要求,则更通用:

val regex = Regex("""\((\d+),\s*(\d+)\)""")

private fun String.parsePairs(): List<Pair<Int, Int>> = regex.findAll(this)
        .map { it.groupValues[1].toInt() to it.groupValues[2].toInt() }
        .toList()

【讨论】:

  • 我最喜欢这个回复中的第一个解决方案,因为它非常易读,并在结果中返回 Pair 的列表。抱歉,我在问题中没有具体说明这一点。另外我学习了 removePrefix() 和 removeSuffix(),太好了!
  • @JimAndreas 谢谢,很高兴为您提供帮助。请注意,这些链接的步骤很好且可读,但会生成一堆中间对象,如果您逐个字符地读取字符串,则不会有这些对象。如果这是一条非常热门的路径,则可能值得“手动”,否则保持整洁很酷。
【解决方案2】:
s.substring(1, s.length-1)
    .split("), (")
    .map { it.split(", ") }
    .map { it[0] to it[1] }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多