Skip to content

コレクション

プログラミングでは、後で処理するためにデータを構造体にグループ化できると便利です。Kotlinはまさにこの目的のためにコレクションを提供します。

Kotlinには、項目をグループ化するための以下のコレクションがあります。

コレクションの型説明
リスト順序付けされた項目のコレクション
セット一意で順序付けされていない項目のコレクション
マップキーが一意で1つの値にのみマップされるキーと値のペアのセット

各コレクションの型はミュータブル(可変)または読み取り専用にすることができます。

リスト

リストは、項目を追加された順序で格納し、重複する項目を許可します。

読み取り専用リスト(List)を作成するには、listOf()関数を使用します。

ミュータブルリスト(MutableList)を作成するには、mutableListOf()関数を使用します。

リストを作成する際、Kotlinは格納される項目の型を推論できます。型を明示的に宣言するには、リスト宣言の後に山括弧< >内に型を追加します。

kotlin
fun main() { 
    // 読み取り専用リスト
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println(readOnlyShapes)
    // [triangle, square, circle]
    
    // 明示的な型宣言を持つミュータブルリスト
    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    println(shapes)
    // [triangle, square, circle]
}

TIP

意図しない変更を防ぐために、ミュータブルリストをListに代入することで、読み取り専用ビューを作成できます。

kotlin

    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")

    val shapesLocked: List<String> = shapes

これはキャストとも呼ばれます。

リストは順序付けされているため、リスト内の項目にアクセスするには、インデックスアクセス演算子 []を使用します。

kotlin
fun main() { 
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("リストの最初の項目は: ${readOnlyShapes[0]}")
    // リストの最初の項目は: triangle
}

リストの最初または最後の項目を取得するには、それぞれ.first()関数と.last()関数を使用します。

kotlin
fun main() { 
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("リストの最初の項目は: ${readOnlyShapes.first()}")
    // リストの最初の項目は: triangle
}

NOTE

.first()関数と.last()関数は、拡張関数の例です。オブジェクトで拡張関数を呼び出すには、オブジェクトの後にピリオド.を付けて関数名を記述します。

拡張関数は、中級ツアーで詳細に説明されています。

現時点では、それらを呼び出す方法を知っていれば十分です。

リスト内の項目の数を取得するには、.count()関数を使用します。

kotlin
fun main() { 
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("このリストには${readOnlyShapes.count()}項目があります")
    // このリストには3つの項目があります
}

項目がリストに含まれているか確認するには、in演算子を使用します。

kotlin
fun main() {
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("circle" in readOnlyShapes)
    // true
}

ミュータブルリストから項目を追加または削除するには、それぞれ.add()関数と.remove()関数を使用します。

kotlin
fun main() { 
    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    // リストに"pentagon"を追加
    shapes.add("pentagon") 
    println(shapes)  
    // [triangle, square, circle, pentagon]

    // リストから最初の"pentagon"を削除
    shapes.remove("pentagon") 
    println(shapes)  
    // [triangle, square, circle]
}

セット

リストは順序付けされており重複する項目を許可するのに対し、セットは順序付けされておらず一意の項目のみを格納します。

読み取り専用セット(Set)を作成するには、setOf()関数を使用します。

ミュータブルセット(MutableSet)を作成するには、mutableSetOf()関数を使用します。

セットを作成する際、Kotlinは格納される項目の型を推論できます。型を明示的に宣言するには、セット宣言の後に山括弧< >内に型を追加します。

kotlin
fun main() {
    // 読み取り専用セット
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    // 明示的な型宣言を持つミュータブルセット
    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
    
    println(readOnlyFruit)
    // [apple, banana, cherry]
}

前の例でわかるように、セットは一意の要素のみを含むため、重複する"cherry"項目は削除されます。

TIP

意図しない変更を防ぐために、ミュータブルセットをSetに代入することで、読み取り専用ビューを作成できます。

kotlin

    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")

    val fruitLocked: Set<String> = fruit

NOTE

セットは順序付けされていないため、特定のインデックスで項目にアクセスすることはできません。

セット内の項目の数を取得するには、.count()関数を使用します。

kotlin
fun main() { 
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    println("このセットには${readOnlyFruit.count()}項目があります")
    // このセットには3つの項目があります
}

項目がセットに含まれているか確認するには、in演算子を使用します。

kotlin
fun main() {
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    println("banana" in readOnlyFruit)
    // true
}

ミュータブルセットから項目を追加または削除するには、それぞれ.add()関数と.remove()関数を使用します。

kotlin
fun main() { 
    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
    fruit.add("dragonfruit")    // セットに"dragonfruit"を追加
    println(fruit)              // [apple, banana, cherry, dragonfruit]
    
    fruit.remove("dragonfruit") // セットから"dragonfruit"を削除
    println(fruit)              // [apple, banana, cherry]
}

マップ

マップは項目をキーと値のペアとして格納します。キーを参照して値にアクセスします。マップは食べ物のメニューのようなものだと想像できます。食べ物(キー)を見つけることで、食べたいものの価格(値)を見つけることができます。リストのように数値インデックスを使用せずに値を検索したい場合に、マップは便利です。

NOTE

  • マップ内のすべてのキーは一意である必要があります。これにより、Kotlinはどの値を取得したいのかを理解できます。

  • マップ内には重複する値を持つことができます。

読み取り専用マップ(Map)を作成するには、mapOf()関数を使用します。

ミュータブルマップ(MutableMap)を作成するには、mutableMapOf()関数を使用します。

マップを作成する際、Kotlinは格納される項目の型を推論できます。型を明示的に宣言するには、マップ宣言の後に山括弧< >内にキーと値の型を追加します。例:MutableMap<String, Int>。キーはString型で、値はInt型です。

マップを作成する最も簡単な方法は、各キーとその関連する値の間にtoを使用することです。

kotlin
fun main() {
    // 読み取り専用マップ
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu)
    // {apple=100, kiwi=190, orange=100}

    // 明示的な型宣言を持つミュータブルマップ
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(juiceMenu)
    // {apple=100, kiwi=190, orange=100}
}

TIP

意図しない変更を防ぐために、ミュータブルマップをMapに代入することで、読み取り専用ビューを作成できます。

kotlin

    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)

    val juiceMenuLocked: Map<String, Int> = juiceMenu

マップ内の値にアクセスするには、インデックスアクセス演算子 []をそのキーと一緒に使用します。

kotlin
fun main() {
    // 読み取り専用マップ
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("アップルジュースの値は: ${readOnlyJuiceMenu["apple"]}")
    // アップルジュースの値は: 100
}

NOTE

マップ内に存在しないキーでキーと値のペアにアクセスしようとすると、null値が表示されます。

kotlin

fun main() {


    // 読み取り専用マップ

    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)

    println("パイナップルジュースの値は: ${readOnlyJuiceMenu["pineapple"]}")

    // パイナップルジュースの値は: null


}

このツアーでは、Null安全性の章でnull値について後で説明します。

インデックスアクセス演算子 []を使用して、ミュータブルマップに項目を追加することもできます。

kotlin
fun main() {
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    juiceMenu["coconut"] = 150 // マップにキー"coconut"と値150を追加
    println(juiceMenu)
    // {apple=100, kiwi=190, orange=100, coconut=150}
}

ミュータブルマップから項目を削除するには、.remove()関数を使用します。

kotlin
fun main() {
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    juiceMenu.remove("orange")    // マップからキー"orange"を削除
    println(juiceMenu)
    // {apple=100, kiwi=190}
}

マップ内の項目の数を取得するには、.count()関数を使用します。

kotlin
fun main() {
    // 読み取り専用マップ
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("このマップには${readOnlyJuiceMenu.count()}キーと値のペアがあります")
    // このマップには3つのキーと値のペアがあります
}

特定のキーがすでにマップに含まれているか確認するには、.containsKey()関数を使用します。

kotlin
fun main() {
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu.containsKey("kiwi"))
    // true
}

マップのキーまたは値のコレクションを取得するには、それぞれkeysvaluesプロパティを使用します。

kotlin
fun main() {
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu.keys)
    // [apple, kiwi, orange]
    println(readOnlyJuiceMenu.values)
    // [100, 190, 100]
}

NOTE

keysvaluesは、オブジェクトのプロパティの例です。オブジェクトのプロパティにアクセスするには、オブジェクトの後にピリオド.を付けてプロパティ名を記述します。

プロパティについては、クラスの章で詳細に議論されています。

このツアーのこの時点では、それらにアクセスする方法を知っていれば十分です。

キーまたは値がマップに含まれているか確認するには、in演算子を使用します。

kotlin
fun main() {
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("orange" in readOnlyJuiceMenu.keys)
    // true
    
    // または、keysプロパティを使用する必要はありません
    println("orange" in readOnlyJuiceMenu)
    // true
    
    println(200 in readOnlyJuiceMenu.values)
    // false
}

コレクションでできることについてさらに詳しく知るには、コレクションを参照してください。

基本型とコレクションの管理方法について学んだので、プログラムで使用できる制御フローを探索する時が来ました。

演習

演習1

「緑」の数字のリストと「赤」の数字のリストがあります。数字が合計でいくつあるかを出力するようにコードを完成させてください。

|---|---|

kotlin
fun main() {
    val greenNumbers = listOf(1, 4, 23)
    val redNumbers = listOf(17, 2)
    // ここにコードを記述してください
}

|---|---|

kotlin
fun main() {
    val greenNumbers = listOf(1, 4, 23)
    val redNumbers = listOf(17, 2)
    val totalCount = greenNumbers.count() + redNumbers.count()
    println(totalCount)
}

演習2

サーバーでサポートされているプロトコルのセットがあります。ユーザーが特定のプロトコルを使用するよう要求します。要求されたプロトコルがサポートされているかどうかを確認するようにプログラムを完成させてください(isSupportedはBoolean値である必要があります)。

|---|---|

kotlin
fun main() {
    val SUPPORTED = setOf("HTTP", "HTTPS", "FTP")
    val requested = "smtp"
    val isSupported = // Write your code here 
    println("Support for $requested: $isSupported")
}

|---|---|

kotlin
fun main() {
    val SUPPORTED = setOf("HTTP", "HTTPS", "FTP")
    val requested = "smtp"
    val isSupported = requested.uppercase() in SUPPORTED
    println("Support for $requested: $isSupported")
}

演習3

1から3までの整数と、それに対応するスペルを関連付けるマップを定義してください。このマップを使用して、与えられた数字をスペルアウトしてください。

|---|---|

kotlin
fun main() {
    val number2word = // ここにコードを記述してください
    val n = 2
    println("$nは'${<ここにコードを記述してください>}'とスペルアウトされます")
}

|---|---|

kotlin
fun main() {
    val number2word = mapOf(1 to "one", 2 to "two", 3 to "three")
    val n = 2
    println("$n is spelt as '${number2word[n]}'")
}

次のステップ

制御フロー