Разделить строку на два котлина - PullRequest
0 голосов
/ 24 января 2019

У меня есть одна строка, которая, если есть более 35 символов, должна быть разбита на другую строку.Нечто подобное var string1 = "1...38" в var result1= "1...35var result2 = "36...38". Я думаю об использовании разделения, но я не знаю, является ли лучший вариант.

Ответы [ 5 ]

0 голосов
/ 24 января 2019

chunked определенно хорошо, если разделение на более чем 2 части подходит и вам. Но если вы предпочитаете разбивать его не более чем на 2 части, причем первая часть имеет определенную длину, а вторая часть содержит только остаток, вы можете вместо этого использовать что-то вроде следующего (аналогично s1m0nw1s answer , но) используя take и substring:

fun String.splitAtIndex(index : Int) = take(index) to substring(index)

Или, если вы хотите быть осторожнее, вы также можете добавить некоторые проверки удобства:

fun String.splitAtIndex(index: Int) = when {
  index < 0 -> 0
  index > length -> length
  else -> index
}.let {
  take(it) to substring(it)
}

или, если вам больше нравятся исключения:

fun String.splitAtIndex(index: Int) = require(index in 0..length).let {
  take(index) to substring(index)
}

Все эти функции возвращают вам Pair<String, String>, с которым вы можете обращаться следующим образом:

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

Поскольку вы писали, что подумали об использовании split, и, если у вас есть соответствующий разделитель, вы можете использовать следующее:

yourInputString.split(yourDelimiter, limit = 2)

Это разделит yourInputString на две части, где первая часть - это вся строка до первого вхождения yourDelimiter. Пример:

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

который напечатает:

this is a string with a delimiter  --- remainder:  and some more information that is not necessary | with some more delimiters | | |
0 голосов
/ 24 января 2019

Chunked метод это то, что вам нужно. Проверьте этот документ ->

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html

0 голосов
/ 24 января 2019

chunked(size: Int) вернет вам строку, разбитую на список:

"Hello There! This is a really long string that I want split".chunked(10)

Результат

["Hello Ther", "e! This is", "a real", "long strin", "g that I w", "ant split"]

0 голосов
/ 24 января 2019

Это расширение даст вам пару ограниченных строк, связанных с остальными:

fun String.limit(max: Int): Pair<String, String> =
    if (length > max) {
        take(max) to takeLast(length - max)
    } else this to ""

Некоторые примеры:

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, )
0 голосов
/ 24 января 2019

Вы должны использовать

drop и droplast (возвращает строку)

val chars = "abcdefghijklmnopqrstuvwxyzabcdefghijkl"
val result1 = chars.dropLast(3) // returns abcdefghijklmnopqrstuvwxyzabcdefghi
val result2 = chars.drop(35) // returns jkl

или chunked (возвращает список строк)

chars.chunked(35)) // returns [abcdefghijklmnopqrstuvwxyzabcdefghi, jkl]

это зависит от вашего контекста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...