我有两个字符串列表。现在我想用索引i的第一个列表中的单词的每个出现替换句子i的第二个列表中的单词。
所以,如果我有
list a=("am","I","my")
和
list b=("are","You","your")
我希望句子“我是一个业余爱好者”成为“你是一个业余爱好者”
什么是Kotlin最简洁的方法(没有for循环)?
您可以使用正则表达式\b\w+\b
来匹配句子中的单词,然后使用lambda调用replace
函数,该lambda为每个匹配提供替换字符串:
val input = "I am an amateur, alas."
val wordsToReplace = listOf("I", "am", "my")
val wordsReplaceWith = listOf("You", "are", "your")
val wordRegex = """\b\w+\b""".toRegex()
val result = wordRegex.replace(input) { match ->
val wordIndex = wordsToReplace.indexOf(match.value)
if (wordIndex >= 0) wordsReplaceWith[wordIndex] else match.value
}
println(result)
如果列表中有很多单词,那么构建它们的地图以加快搜索速度是有意义的:
val replaceMap = (wordsToReplace zip wordsReplaceWith).toMap()
val result = wordRegex.replace(input) { match ->
replaceMap[match.value] ?: match.value
}
首先将字符串拆分为其单词列表,然后将列表a
中存在的每个单词映射到列表b
中的相应单词。最后重新加入字符串:
val a= listOf("am","I","my")
val b= listOf("are","You","your")
val str = "I am an amateur"
val new = str
.split("\\s+".toRegex())
.map { val i = a.indexOf(it); if (i < 0) it else b[i] }
.joinToString(" ")
另一种做同样事情的方法是:
var new = " $str "
a.forEachIndexed { i, s -> new = new.replace(" $s ", " ${b[i]} ") }
new = new.trim()
虽然这更接近for循环。
我假设没有标点符号,所有空格都是空格等等。
val m = a.zip(b).toMap()
return s.split(' ').joinToString(" ") { m[it] ?: it }
首先,您创建一个地图m
,以实现更高效的映射。然后
m
包含单词,则返回值(即替换),否则返回原始单词(因为我们不应该替换它)。