J'ai une liste de chaînes mutables et j'essaie de supprimer un mot de chacune d'elles. Le problème est que je ne pense pas que le mot soit supprimé de chaque ligne.
WINTER FORMAL
La chaîne est
SUMMARY WINTER FORMAL
et j'ai besoin
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")
}
}
mais quelle qu'en soit la raison, il n'apparaît tout simplement pas. Je sais comment faire cela en java mais je n'ai aucune idée de comment faire cela dans Kotlin et je n'ai trouvé aucune fonction capable d'accomplir cela. Que me manque-t-il?
3 Réponses :
removePrefix supprime la partie spécifique de la chaîne uniquement si c'est le préfixe. Ce n'est évidemment pas votre cas. Vous pouvez effectuer une séquence split , filter , join pour obtenir le résultat attendu.
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"
Mais si vous avez plusieurs espaces contigus, ils deviendront un espace dans la sortie. Cette méthode ne fonctionne pas non plus si "SUMMARY" n'est pas entouré d'espaces, par ex. "SUMMARYWINTERFORMAL" ne sera pas modifié.
Vous pouvez supprimer une partie de la chaîne en la remplaçant par une chaîne vide, mais notez que cela conservera tous les caractères environnants, y compris les espaces environnants.
println("SUMMARY WINTER FORMAL".replace("SUMMARY",""))
//output : " WINTER FORMAL"
Notez qu'il y a un espace devant "WINTER"
Si vous ne voulez pas inclure les espaces le cas échéant, utiliser l'expression régulière ferait:
println("SUMMARY WINTER FORMAL".split(" ").filter { it != "SUMMARY" }.joinToString(" "))
//output : "WINTER FORMAL"
Vous pouvez encore plus modifier l'expression régulière pour mieux l'adapter à votre cas d'utilisation.
Les chaînes de Kotlin (et Java) sont immuables. Donc item.removePrefix renvoie une nouvelle chaîne et vous devez mettre à jour la liste ou créer une nouvelle liste comme celle-ci:
for (item in eventLines) {
when {
item.contains("SUMMARY") ->
eventLinesWithPrefixRemoved.add(item.removePrefix("SUMMARY"))
else -> eventLinesWithPrefixRemoved.add(item)
}
}
Je n'ai pas réalisé qu'ils ne pouvaient pas être modifiés, merci!
Si vous souhaitez uniquement supprimer "SUMMARY" de la chaîne, vous pouvez utiliser ce cas
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]
Voici une astuce pour le futur, écrivez du code en java et collez-le dans Android Studio et il vous demandera de le convertir en kotlin, appuyez simplement sur oui. Cela fonctionne la plupart du temps pour de petits morceaux de code