Kotlin - リスト

公開日:2019-11-06 更新日:2019-11-06
[Kotlin]

1. 概要

リストの使い方についてです。
リストは複数の値を保持することができます。


2. リストの生成

リストを生成するには、listOf() または mutableListOf() を使用します。
listOf() は読み込み専用です。
mutableListOf() は要素の追加、変更、削除などを行うことができます。
var lst1 =        listOf("a", "b", "c", "d", "e") // 要素の変更不可
var lst2 = mutableListOf("a", "b", "c", "d", "e") // 要素の変更可
var lst3 = mutableListOf<Int>(1, 2, 3)            // 数値のみ設定可


3. 要素の取得

var lst = listOf("a", "b", "c", "d")

//インデックスを指定して要素の取得
println(lst[0])     // a
println(lst.get(1)) // b (非推奨)


4. 要素の設定

var lst = mutableListOf("a", "b", "c", "d")

//インデックスを指定して要素の取得
lst[0] = "A"
lst[1] = "B"
println(lst) // [A, B, c, d]


5. 要素の追加

var lst = mutableListOf("b", "c", "d")

lst.add(0, "a") // 先頭に追加
lst.add("e")    // 末尾に追加
println(lst) // [a, b, c, d, e]


6. 要素の削除

var lst = mutableListOf("a", "b", "c", "d", "e")

// 先頭から 2つの要素の削除
var lst2 = lst.drop(2)
println(lst2) // [c, d, e]

// 末尾から 1つの要素の削除
var lst3 = lst.dropLast(2)
println(lst3) // [a, b, c]


7. 要素でループ

var lst = listOf("a", "b", "c")
lst.forEach{
    print(it)
}
//結果: abc


8. ソート

var lst = listOf("c", "a", "d", "b", "e")
lst = lst.sorted()
println(lst) // [a, b, c, d, e]


9. 重複の除去

var lst = listOf("a", "a", "b", "c", "c")
lst = lst.distinct()
println(lst) // [a, b, c]


10. 絞り込み

filter を使うと、ラムダ式による要素の絞り込みが行えます。
var lst = listOf("width", "height", "margin-left", "margin-right")
var lst2 = lst.filter { s -> s.startsWith("margin") }
println(lst2) // [margin-left, margin-right]


11. 要素数の取得

要素数は size で取得して、条件に一致する要素数を取得したい時は count() を使います。
var lst = listOf("width", "height", "margin-left", "margin-right")

println(lst.size) // 4

println(lst.count{
    it.startsWith("margin")
}) // 2


12. 型の指定

ジェネリクスで型を指定して、要素の型を制限することができます。
以下のリストの要素は、 String に限定されます。
var lst = mutableListOf<String>("a", "b", "c")

また、ジェネリクスで指定しない場合でも、リストの値から自動的に型が決定するため注意が必要です。

以下の場合は、型推論により String と判定されるため、数値を設定するとコンパイルエラーになります。
<Any> を付けるか、要素に数値を入れて、型推論で Any にする必要があります。
var lst = mutableListOf("a", "b", "c")
lst.add(123) //エラー

以下の場合は数値で統一されていますが、Int と Double で型が異なるため、Any として扱われます。
その結果、String の値も設定できるようになるため要注意です。
ジェネリクスを付けられるものは、なるべく付けた方が良いかもしれません。
var lst = mutableListOf(1, 0.5)
lst.add("test")

println(lst) // [1, 0.5, test]