4
votes

Supprimer le mot de la liste de chaînes dans Kotlin

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?


1 commentaires

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


3 Réponses :


3
votes

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.


0 commentaires

3
votes

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)
    }

}


1 commentaires

Je n'ai pas réalisé qu'ils ne pouvaient pas être modifiés, merci!



0
votes

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]


0 commentaires