Заменить вхождение в строку в Котлине - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть два списка строк.Теперь я хочу заменить каждое вхождение слова в первом списке в индексе i словом во втором списке в индексе i предложения.

Итак, если у меня есть

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

и

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

Я хочу, чтобы предложение «Я любитель» стало «Вы любитель»

Какой самый чистый способ сделать это в Kotlin (без цикла for)?

Ответы [ 3 ]

0 голосов
/ 22 апреля 2019

Сначала разбейте строку на список ее слов, а затем сопоставьте каждое слово, если оно существует в списке 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 голосов
/ 22 апреля 2019

Полагаю, что знаков препинания нет, все пробелы являются пробелами и т. Д.

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

Сначала вы создаете карту m для более эффективного ... отображения.Затем

  1. Разделить строку, чтобы получить список слов
  2. Отобразить все слова: если m содержит слово, то вернуть значение (то есть замену), в противном случае вернутьоригинальное слово (поскольку мы не должны его заменять).
  3. Соедините все слова, разделите их пробелами.
0 голосов
/ 22 апреля 2019

Вы можете использовать регулярное выражение \b\w+\b, чтобы сопоставить слова в предложении, а затем вызвать replace функцию с лямбда-выражением, которая обеспечивает строку замены для каждого соответствия:

    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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...