Skip to content

コレクション

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

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

コレクションの型説明
リスト順序付けられたアイテムのコレクション
セットユニークで順序付けられていないアイテムのコレクション
マップキーがユニークで、それぞれが1つの値にマップされるキーと値のペアのセット

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

リスト

リストは、アイテムを追加した順序で格納し、重複したアイテムを許可します。

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

可変リスト(MutableList)を作成するには、mutableListOf()関数を使用します。

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

kotlin
fun main() {
    // Read only list
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println(readOnlyShapes)
    // [triangle, square, circle]

    // Mutable list with explicit type declaration
    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    println(shapes)
    // [triangle, square, circle]
}

意図しない変更を防ぐため、可変リストを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("The first item in the list is: ${readOnlyShapes[0]}")
    // The first item in the list is: triangle
}

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

kotlin
fun main() {
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("The first item in the list is: ${readOnlyShapes.first()}")
    // The first item in the list is: triangle
}

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

拡張関数は中級ツアーで詳しく説明されています。現時点では、その呼び出し方を知っているだけで十分です。

リスト内のアイテム数を取得するには、count()関数を使用します。

kotlin
fun main() {
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("This list has ${readOnlyShapes.count()} items")
    // This list has 3 items
}

アイテムがリスト内にあるかを確認するには、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")
    // Add "pentagon" to the list
    shapes.add("pentagon")
    println(shapes)
    // [triangle, square, circle, pentagon]

    // Remove the first "pentagon" from the list
    shapes.remove("pentagon")
    println(shapes)
    // [triangle, square, circle]
}

セット

リストが順序付けされ重複アイテムを許可するのに対し、セットは順序付けされておらずユニークなアイテムのみを格納します。

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

可変セット(MutableSet)を作成するには、mutableSetOf()関数を使用します。

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

kotlin
fun main() {
    // Read-only set
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    // Mutable set with explicit type declaration
    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")

    println(readOnlyFruit)
    // [apple, banana, cherry]
}

前の例でわかるように、セットはユニークな要素のみを含むため、重複した"cherry"アイテムは破棄されます。

意図しない変更を防ぐため、可変セットをSetに割り当てることで、読み取り専用のビューを作成できます。

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

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

セット内のアイテム数を取得するには、count()関数を使用します。

kotlin
fun main() {
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    println("This set has ${readOnlyFruit.count()} items")
    // This set has 3 items
}

アイテムがセット内にあるかを確認するには、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")    // Add "dragonfruit" to the set
    println(fruit)              // [apple, banana, cherry, dragonfruit]

    fruit.remove("dragonfruit") // Remove "dragonfruit" from the set
    println(fruit)              // [apple, banana, cherry]
}

マップ

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

  • マップ内のすべてのキーは、Kotlinがどの値を取得したいかを理解できるようにユニークでなければなりません。
  • マップには重複した値を含めることができます。

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

可変マップ(MutableMap)を作成するには、mutableMapOf()関数を使用します。

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

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

kotlin
fun main() {
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu)
    // {apple=100, kiwi=190, orange=100}

    // Mutable map with explicit type declaration
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(juiceMenu)
    // {apple=100, kiwi=190, orange=100}
}

意図しない変更を防ぐため、可変マップを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() {
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("The value of apple juice is: ${readOnlyJuiceMenu["apple"]}")
    // The value of apple juice is: 100
}

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

kotlin
fun main() {
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("The value of pineapple juice is: ${readOnlyJuiceMenu["pineapple"]}")
    // The value of pineapple juice is: null
}

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

インデックスアクセス演算子[]を使用して、可変マップにアイテムを追加することもできます。

kotlin
fun main() {
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    juiceMenu["coconut"] = 150 // Add key "coconut" with value 150 to the map
    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")    // Remove key "orange" from the map
    println(juiceMenu)
    // {apple=100, kiwi=190}
}

マップ内のアイテム数を取得するには、count()関数を使用します。

kotlin
fun main() {
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("This map has ${readOnlyJuiceMenu.count()} key-value pairs")
    // This map has 3 key-value pairs
}

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

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

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

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]
}

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

プロパティについては、クラスの章で詳しく説明しています。このツアーのこの時点では、そのアクセス方法を知っているだけで十分です。

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

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

    // Alternatively, you don't need to use the keys property
    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)
    // Write your code here
}
解答例
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 = // Write your code here
    val n = 2
    println("$n is spelt as '${<Write your code here >}'")
}
解答例
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]}'")
}