Удалить слово из списка строк в Kotlin - PullRequest
4 голосов
/ 02 апреля 2019

У меня есть изменяемый список строк, и я пытаюсь удалить слово из каждой из них.Проблема в том, что я не верю, что слово удаляется из каждой строки.

    for (item in stringLines) {

        when {

            item.contains("SUMMARY") -> eventLines.add(item)
            item.contains("DTSTART") -> startDateLines.add(item)
            item.contains("DTEND") -> endDateLines.add(item)
            //item.contains("URL:") -> locationLines.add(item)
            //item.contains("CATEGORIES") -> categoriesLines.add(item)
    }

    }

    for (item in eventLines) {

        when{
            item.contains("SUMMARY") -> item.removePrefix("SUMMARY")
        }

    }

Строка

SUMMARY WINTER FORMAL

и мне нужно

WINTER FORMAL

но по какой-то причине это просто не появляется.Я знаю, как сделать это в Java, но я не знаю, как это сделать в Kotlin, и я не мог найти функцию, которая могла бы выполнить это.Чего мне не хватает?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Строки в Kotlin (и Java) являются неизменяемыми.Таким образом, item.removePrefix возвращает новую строку, и вы должны обновить список или создать новый список следующим образом:

for (item in eventLines) {

    when {
        item.contains("SUMMARY") -> 
            eventLinesWithPrefixRemoved.add(item.removePrefix("SUMMARY"))
        else -> eventLinesWithPrefixRemoved.add(item)
    }

}
3 голосов
/ 02 апреля 2019

removePrefix удаляет определенную часть строки, только если это префикс.Очевидно, это не ваш случай.Вы можете выполнить последовательность split, filter, join, чтобы получить ожидаемый результат.

println("SUMMARY WINTER FORMAL".split(" ").filter { it != "SUMMARY" }.joinToString(" ")) 
//output : "WINTER FORMAL"

Но если у вас есть несколько смежных пробелов, они станут одним пробелом в выходных данных.Также этот метод не работает, если «SUMMARY» не окружен пробелами, например, «SUMMARYWINTERFORMAL» не будет изменен.

Вы можете удалить часть строки, заменив ее пустой строкой, но обратите внимание, что этосохранит все окружающие символы, включая окружающие пробелы.

println("SUMMARY WINTER FORMAL".replace("SUMMARY",""))
//output : " WINTER FORMAL"

Обратите внимание, что перед "WINTER" есть пробел

Если вы не хотите включать пробелы, если они есть, используйтеРегулярное выражение будет делать:

println("SUMMARY WINTER FORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTER FORMAL"
println("SUMMARYWINTERFORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTERFORMAL"
println("  SUMMARY  WINTER FORMAL".replace("\\s*SUMMARY\\s*".toRegex(),""))
//output : "WINTER FORMAL"

Вы можете изменить регулярное выражение еще больше, чтобы лучше соответствовать вашему варианту использования.

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

Если вы хотите удалить только «SUMMARY» из строки, вы можете использовать этот случай

val l = listOf("SUMMARY WINTER FORMAL", "SUMMARY FORMAL", "WINTER FORMAL", "SUMMARY WINTER")

    println(
        l.map {
            it.split(" ")
                .filter { s -> s != "SUMMARY" }
                .joinToString(" ")
        }
    ) // puts [WINTER FORMAL, FORMAL, WINTER FORMAL, WINTER]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...