Kotlin:将由括号分隔的对列表解析为 Pairs() 列表
Kotlin: parsing a list of pairs delimited by parentheses into a list of Pairs()
还没想好怎么用Kotlin的split
函数把这一系列的边解析成Pairs
的List
。
(2, 4), (3, 6), (5, 1), (8, 9), (10, 12), (11, 7)
我可以毫无问题地逐个字符地编写一个字符解析器 - 但是否有针对此解析问题的 Kotlin 解决方案?
s.substring(1, s.length-1)
.split("), (")
.map { it.split(", ") }
.map { it[0] to it[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()
还没想好怎么用Kotlin的split
函数把这一系列的边解析成Pairs
的List
。
(2, 4), (3, 6), (5, 1), (8, 9), (10, 12), (11, 7)
我可以毫无问题地逐个字符地编写一个字符解析器 - 但是否有针对此解析问题的 Kotlin 解决方案?
s.substring(1, s.length-1)
.split("), (")
.map { it.split(", ") }
.map { it[0] to it[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()