J'ai une chaîne qui, si elle contient plus de 35 caractères, doit être divisée en une autre chaîne. Quelque chose comme ça var string1 = "1 ... 38" dans var result1 = "1 ... 35 " et var result2 = "36 ... 38 ". Je pense utiliser un split mais je ne sais pas si c'est la meilleure option.
5 Réponses :
Vous devriez plutôt utiliser
drop et droplast (renvoie une chaîne)
chars.chunked(35)) // returns [abcdefghijklmnopqrstuvwxyzabcdefghi, jkl]
ou chunked (renvoie une liste de chaînes)
val chars = "abcdefghijklmnopqrstuvwxyzabcdefghijkl" val result1 = chars.dropLast(3) // returns abcdefghijklmnopqrstuvwxyzabcdefghi val result2 = chars.drop(35) // returns jkl
qui dépend de votre contexte
Pourquoi ne partagez-vous pas le code sudo? cela rendrait cette réponse beaucoup plus utile ;-)
chunked (size: Int) vous rendra votre chaîne divisée en une liste:
"Hello There! This is a really long string that I want split".chunked(10)
Résultat
["Hello Ther", "e! This is", "a vraiment", "long strin", "g that I w", "four split"]
Est-ce ce que le PO a demandé? Je pense qu'ils veulent se diviser en 2 cordes max
Cette extension vous donnera une paire de la chaîne limitée associée au reste:
val string1 = "onqweinalsdmuizqbwnöfasdkdasqwrwfeqewwqeweqewf" //more than 35 val string2 = "onqweinalsdmuizqbwnöfasdkdasqwrwfeq" //exactly 35 val string3= "asdqwe" //less than 35 println(string1.limit(35)) // -> (onqweinalsdmuizqbwnöfasdkdasqwrwfeq, ewwqeweqewf) println(string2.limit(35)) // -> (onqweinalsdmuizqbwnöfasdkdasqwrwfeq, ) println(string3.limit(35)) // -> (asdqwe, )
Quelques exemples:
fun String.limit(max: Int): Pair<String, String> =
if (length > max) {
take(max) to takeLast(length - max)
} else this to ""
La méthode fragmentée est ce dont vous avez besoin. Vérifiez ce document ->
https://kotlinlang.org/api/latest /jvm/stdlib/kotlin.collections/chunked.html
Hé! pls ajouter un exemple et un peu d'explication. Les réponses aux liens uniquement ne sont pas très utiles car le contenu vers lequel pointe le lien peut changer ou disparaître. :)
fragmenté a> est tout à fait correct si le découpage en plus de 2 morceaux vous convient également. Mais si vous vouliez plutôt le diviser en 2 parties au maximum, la première étant d'une certaine longueur et la seconde ne contenant que le reste, vous voudrez peut-être utiliser quelque chose comme ce qui suit à la place (similaire à réponse s1m0nw1 , mais) en utilisant take et substring :
this is a string with a delimiter --- remainder: and some more information that is not necessary | with some more delimiters | | |
Ou si vous voulez jouer la sécurité, vous pouvez également ajouter quelques vérifications de commodité:
val yourInputString = "this is a string with a delimiter | and some more information that is not necessary | with some more delimiters | | |"
yourInputString.split('|', limit = 2).also {
(uptoFirstDelimiter, remainder) -> println("$uptoFirstDelimiter --- remainder: $remainder")
}
ou si vous préférez les exceptions:
yourInputString.split(yourDelimiter, limit = 2)
Toutes ces fonctions vous renvoient un Pair , que vous pouvez gérer comme suit:
"someString".splitAtIndex(5).also { (atMost5Chars, remainder) ->
println("$atMost5Chars | remainder: $remainder")
}
"someOther".splitAtIndex(4).also {
(first) -> println(first) // discard the remainder... but then again you could have used also just take(4)
}
Comme vous l'avez écrit, vous avez pensé à utiliser s plit et si vous avez un délimiteur approprié sous la main, vous pouvez également utiliser ce qui suit à la place:
fun String.splitAtIndex(index: Int) = require(index in 0..length).let {
take(index) to substring(index)
}
Cela divisera yourInputString en deux morceaux où le premier morceau est toute la chaîne jusqu'à la première occurrence de yourDelimiter . Exemple:
fun String.splitAtIndex(index: Int) = when {
index < 0 -> 0
index > length -> length
else -> index
}.let {
take(it) to substring(it)
}
qui imprimera:
fun String.splitAtIndex(index : Int) = take(index) to substring(index)
comment pourriez-vous diviser la chaîne? avez-vous un délimiteur quelque part? Cela dépend du nombre de pièces avec lesquelles vous voulez finir et si vous avez vraiment besoin de
result2à la fin ...takeet peut-êtrefragmentéprobablement suffit déjà ... si vous avez un délimiteur et ne voulez que 2 pièces, vous pouvez également utilisersplit (yourDelimiter, limit = 2)...