No Programming, No Life

プログラミング関連の話題や雑記

Kotlinで二つのリストの要素をペアにしたリストやマップにまとめる

f:id:fumokmm:20191207000933p:plain

zipメソッド

Kotlinでzipはどうやるのかな?と思って調べた内容です。いろいろありそうだけど、とりあえずシンプルなものをメモしておく。 Kotlinにはそのものズバリの zip というメソッドが List や Array に用意されている。

list.zip

val list1 = listOf("A", "B", "C")
val list2 = listOf(100, 200, 300)
println(list1.zip(list2))

Output

[(A, 100), (B, 200), (C, 300)]

array.zip

val array1 = arrayOf("a", "b", "c")
val array2 = arrayOf(400, 500, 600)
println(array1.zip(array2))

Output

[(a, 400), (b, 500), (c, 600)]

出力結果の (A, 100) などの部分は、Pair<out A, out B> 型となっているようです(ところでoutってなんだ?勉強不足)。

さて、これでペアのリストが得られた。例えば以下のようにすれば、1番目の最初の要素 "a" が取得できる。

array1.zip(array2)[0].first // => "a"

associateメソッド

さて、次はマップにまとめたい。それには Collection#associate を使うといいらしい。ペアのリスト List<Pair<A, B>> をアソシエイトすると、マップ Map<A, B> が出来上がるようだ。

associate map

val list1 = listOf("A", "B", "C")
val list2 = listOf(100, 200, 300)
println(list1.zip(list2).associate{ it })

Output

{A=100, B=200, C=300}
200

いい感じにマップが得られた。使い心地はこんな感じ。

list1.zip(list2).associate{ it }["B"] // => 200

参考

zip - Kotlin Programming Language

Pair - Kotlin Programming Language

【Kotlin】複数の値を返したい! - Qiita

associate - Kotlin Programming Language

Kotlin の Collection まとめ ~List編~ - Qiita