Kotlinでコレクションを操作する関数のメモ
ここでは、忘れやすいKotlinでの配列の宣言や、コレクションを操作するときに便利な関数などを紹介します。
目次
コレクション操作関数まとめ
配列
Kotlinではあまり使わないけど、ごく稀に必要なときに思い出せない、配列の宣言など。
配列の宣言と初期化
書き方が思い出せない配列の宣言。
// サイズ5の配列を生成して0で初期化
val array = Array(5) { 0 }
array.forEachIndexed { index, i -> println("index[$index]=$i") }
// index[0]=0
// index[1]=0
// index[2]=0
// index[3]=0
// index[4]=0
// サイズ5の配列を生成して0〜4で初期化
val array = Array(5) { it }
array.forEachIndexed { index, i -> println("index[$index]=$i") }
// index[0]=0
// index[1]=1
// index[2]=2
// index[3]=3
// index[4]=4
2次元配列の宣言と初期化
いざコードを書こうとして必ず手が止まる、2次元配列の宣言。
// サイズ5×5の配列を生成して0で初期化
val array2d = Array(5) { Array(5) { 0 } }
repeat(array2d.size) { i ->
repeat(array2d[i].size) { j ->
println("index[$i][$j]=${array2d[i][j]}")
}
}
// index[0][0]=0
// index[0][1]=0
// index[0][2]=0
// index[0][3]=0
// index[0][4]=0
// ・・・省略・・・
// index[4][0]=0
// index[4][1]=0
// index[4][2]=0
// index[4][3]=0
// index[4][4]=0
// サイズ5×5の配列を生成して0〜4で初期化
val array2d = Array(5) { Array(5) { it } }
repeat(array2d.size) { i ->
repeat(array2d[i].size) { j ->
println("index[$i][$j]=${array2d[i][j]}")
}
}
// index[0][0]=0
// index[0][1]=1
// index[0][2]=2
// index[0][3]=3
// index[0][4]=4
// ・・・省略・・・
// index[4][0]=0
// index[4][1]=1
// index[4][2]=2
// index[4][3]=3
// index[4][4]=4
コレクション
コレクションを操作するときに便利な関数など。
イミュータブル(読み取り専用)なコレクションを生成
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// リスト以外にも setOf(・・・)、 mapOf(・・・) が使える
ミュータブル(書き込み可能)なコレクションを生成
val numbers = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// リスト以外にも mutableSetOf(・・・)、mutableMapOf(・・・) が使える
List -> Mapに変換(associate, associateBy)
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// associate
// 要素ごとのPairを作り、Mapに変換する
println(numbers.associate { it to it * 2 })
{1=2, 2=4, 3=6, 4=8, 5=10, 6=12, 7=14, 8=16, 9=18, 10=20}
// associateBy
// 各要素の値をバリュー、ラムダ式の結果をキーとしたMapに変換する
println(numbers.associateBy { it * 2 })
{2=1, 4=2, 6=3, 8=4, 10=5, 12=6, 14=7, 16=8, 18=9, 20=10}
ネストしたリストの要素を平坦にする(flatMap, flatten)
// flatMap
val list = listOf(listOf(1, 2), listOf(3, 4), listOf(5))
println(list.flatMap { it })
// [1, 2, 3, 4, 5]
// flatten()
val list = listOf(listOf(1, 2), listOf(3, 4), listOf(5))
println(list.flatten())
// [1, 2, 3, 4, 5]
指定した要素がリストに存在するかを判定する(contains)
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
println(numbers.contains(10)) // true
println(numbers.contains(11)) // false
畳み込み処理(fold, reduce)
// fold
val evenNums = listOf(2, 4, 6, 8, 10)
val summary = evenNums.fold(initial = 1) { sum, element -> sum + element } // 初期値=1
println(summary) // 31 (1+2) -> (3+4) -> (7+6) -> (13+8) -> (21+10)
// reduce
val evenNums = listOf(2, 4, 6, 8, 10)
val summary = evenNums.reduce { acc, element -> acc + element }
println(summary) // 30 (2+4) -> (6+6) -> (12+8) -> (20+10)
共通した要素の集合を求める(intersect)
val setA = setOf(1, 2, 3, 4, 5)
val setB = setOf(2, 4, 6, 8, 10)
println(setA.intersect(setB)) // [2, 4]
リストから指定した要素を取り除いた新しいリストを返す(minus)
val letters = listOf("l", "e", "t", "t", "e", "r", "s")
val exclude = listOf("e", "t")
println(letters.minus(exclude)) // ["l", "r", "s"]
参考
Java言語が長かった人には特におすすめ。というかKotlinやるならこれを読まないと損します。
メイン言語がJavaの方でこれからKotlinを学習するならまずはこの書籍。これ以上最適は書籍はないといっても過言ではありません。Javaの記述がKotlinだとこう書ける!を丁寧に解説。