2017-08-13 9 views
6

文字列をそれぞれ2文字の文字列に分割する慣習的な方法はありますか?文字をn文字ごとに分割する

例:

"" -> [""] 
"ab" -> ["ab"] 
"abcd" -> ["ab", "cd"] 

私たちは、文字列は、私がthis Java answerでのような正規表現を使用することができます。2.

の倍数であるが、私はより良い方法を見つけることを期待していた長さを持っていると仮定することができます(すなわち、コトリンの追加の方法の1つを使用して)。

答えて

9

Kotlin 1.2がリリースされたらkotlin-stdlibに追加されたchunked機能をKEEP-11提案で使用できます。例:

val chunked = myString.chunked(2) 

Kotlin 1.2 M2 pre-releaseでこれを試すことができます。


はそれまでは、このコードで同じことを実現することができます:

println("abcdef".chunked(2)) // [ab, cd, ef] 

fun String.chunked(size: Int): List<String> { 
    val nChunks = length/size 
    return (0 until nChunks).map { substring(it * size, (it + 1) * size) } 
} 
この実装は、以下 size要素である、残りを廃棄します。あなたは結果に余りを加えることもできます。

+0

、元の文字列の長さが均一でない場合ならば、私は、実装に問題があると思います。 –

+0

@ LiorBar-Onなぜですか?それはちょうど残りを落とすでしょう。 – hotkey

+0

あなたは正しいです。私は質問のメモを忘れてしまった。 –

1

generateSequenceを使用してchunkedの機能バージョン:

fun String.split(n: Int) = Pair(this.drop(n), this.take(n)) 
fun String.chunked(n: Int): Sequence<String> = 
     generateSequence(this.split(n), { 
      when { 
       it.first.isEmpty() -> null 
       else -> it.first.split(n) 
      } 
     }) 
       .map(Pair<*, String>::second) 

は出力

"".chunked(2) => [] 
"ab".chunked(2) => [ab] 
"abcd".chunked(2) => [ab, cd] 
"abc".chunked(2) => [ab, c] 
関連する問題