替换Kotlin中String中的出现

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

我有两个字符串列表。现在我想用索引i的第一个列表中的单词的每个出现替换句子i的第二个列表中的单词。

所以,如果我有

list a=("am","I","my")

list b=("are","You","your")

我希望句子“我是一个业余爱好者”成为“你是一个业余爱好者”

什么是Kotlin最简洁的方法(没有for循环)?

list arraylist kotlin replace
3个回答
0
投票

您可以使用正则表达式\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
    }

0
投票

首先将字符串拆分为其单词列表,然后将列表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循环。


0
投票

我假设没有标点符号,所有空格都是空格等等。

val m = a.zip(b).toMap()
return s.split(' ').joinToString(" ") { m[it] ?: it }

首先,您创建一个地图m,以实现更高效的映射。然后

  1. 拆分字符串以获取单词列表
  2. 映射所有单词:如果m包含单词,则返回值(即替换),否则返回原始单词(因为我们不应该替换它)。
  3. 加入所有单词,用空格分隔。
© www.soinside.com 2019 - 2024. All rights reserved.