1
votes

Split String en deux Kotlin

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.


1 commentaires

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 ... take et peut-être fragmenté probablement suffit déjà ... si vous avez un délimiteur et ne voulez que 2 pièces, vous pouvez également utiliser split (yourDelimiter, limit = 2) ...


5 Réponses :


4
votes

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


1 commentaires

Pourquoi ne partagez-vous pas le code sudo? cela rendrait cette réponse beaucoup plus utile ;-)



6
votes

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"]


1 commentaires

Est-ce ce que le PO a demandé? Je pense qu'ils veulent se diviser en 2 cordes max



1
votes

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 ""


0 commentaires

1
votes

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


1 commentaires

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. :)



5
votes

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)


0 commentaires