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