fkm blog

software開発に関することを書いていきます

Kotlinでリストの中身を連結した文字列を作る

Kotlinは1つのことをやるのに、いろんな書き方ができてしまう、困った言語(Goに比べて)

ということで今回のテーマは、「リストの中身を連結したい」
基準となるコードはこんな感じ。

fun main(args: Array<String>) {
    val numbers = (1..10000).map{ Integer.toString(it) }.toList()
    val before = System.currentTimeMillis()

    // ここで連結処理

    val after = System.currentTimeMillis()
    print("time ")
    println(after - before)
}

Javaっぽくforで

val buffer = StringBuilder()
for (n in numbers) {
    buffer.append(n)
}

素数を1000万にして、手元のMBP 2015で2秒程度。

forEach

コレクションに対してはforEachが使えるんでした。

val buffer = StringBuilder()
numbers.forEach {
    buffer.append(it)
}

こちらも、要素数を1000万にして2秒程度。forとほぼ同じですな。

reduce

コレクションの要素を足していく用途としてreduceというのもありました。

val str = numbers.reduce { acc, s -> acc + s }

単純な文字列の足し算しちゃってるので、速度的にもやばそう。予想通り、10万要素で9秒。

joinTo

要素をくっつける用のメソッドがあったりする。

val buffer = StringBuilder()
numbers.joinTo(buffer = buffer, separator = "")

速度は、1000万要素で2秒程度。StringBuilderでくっつけてるので、早い。

joinToString

もう少し短くかけるメソッドまで用意されてたりする。

val str = numbers.joinToString(separator = "")

速度は1000万要素で2秒程度。

まとめ

いろんな書き方がありすぎなんじゃ。。。