#android #kotlin
#Android #kotlin
Вопрос:
У меня есть изменяемый список строк, и я пытаюсь удалить слово из каждой из них. Проблема в том, что я не верю, что слово удаляется из каждой строки.
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, и я не смог найти ни одной функции, которая была бы способна выполнить это. Чего мне не хватает?
Комментарии:
1. Вот совет на будущее: напишите код на java и вставьте его в android Studio, и он попросит преобразовать его в kotlin, просто нажмите да . В большинстве случаев это работает для небольших фрагментов кода
Ответ №1:
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"
Вы можете еще больше изменить регулярное выражение, чтобы оно лучше соответствовало вашему варианту использования.
Ответ №2:
Строки в Kotlin (и Java) являются неизменяемыми. Таким образом, item.removePrefix
возвращается новая строка, и вам нужно обновить список или создать новый список, подобный этому:
for (item in eventLines) {
when {
item.contains("SUMMARY") ->
eventLinesWithPrefixRemoved.add(item.removePrefix("SUMMARY"))
else -> eventLinesWithPrefixRemoved.add(item)
}
}
Комментарии:
1. Не понял, что их нельзя изменить, спасибо!
Ответ №3:
Если вы хотите удалить только ‘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]