コレクション
Hello world
Basic types
コレクション
制御フロー
関数
クラス
Null安全性
プログラミングにおいて、後で処理するためにデータを構造にグループ化できると便利です。Kotlinはまさにこの目的のためにコレクションを提供します。
Kotlinには、アイテムをグループ化するための以下のコレクションがあります。
コレクションの型 | 説明 |
---|---|
リスト | 順序付けられたアイテムのコレクション |
セット | ユニークで順序付けられていないアイテムのコレクション |
マップ | キーがユニークで、それぞれが1つの値にマップされるキーと値のペアのセット |
各コレクションの型は、可変(ミュータブル)または読み取り専用(リードオンリー)にすることができます。
リスト
リストは、アイテムを追加した順序で格納し、重複したアイテムを許可します。
読み取り専用リスト(List
)を作成するには、listOf()
関数を使用します。
可変リスト(MutableList
)を作成するには、mutableListOf()
関数を使用します。
リストを作成する際、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
に割り当てることで、読み取り専用のビューを作成できます。kotlinval shapes: MutableList<String> = mutableListOf("triangle", "square", "circle") val shapesLocked: List<String> = shapes
これはキャスティングとも呼ばれます。
リストは順序付けされているため、リスト内のアイテムにアクセスするには、インデックスアクセス演算子[]
を使用します。
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()
関数を使用します。
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()
関数を使用します。
fun main() {
val readOnlyShapes = listOf("triangle", "square", "circle")
println("This list has ${readOnlyShapes.count()} items")
// This list has 3 items
}
アイテムがリスト内にあるかを確認するには、in
演算子を使用します。
fun main() {
val readOnlyShapes = listOf("triangle", "square", "circle")
println("circle" in readOnlyShapes)
// true
}
可変リストにアイテムを追加または削除するには、それぞれadd()
関数とremove()
関数を使用します。
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は格納されるアイテムの型を推論できます。型を明示的に宣言するには、セット宣言の後に山括弧<>
内に型を追加します。
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
に割り当てることで、読み取り専用のビューを作成できます。kotlinval fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry") val fruitLocked: Set<String> = fruit
セットは順序付けされていないため、特定のインデックスにあるアイテムにアクセスすることはできません。
セット内のアイテム数を取得するには、count()
関数を使用します。
fun main() {
val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
println("This set has ${readOnlyFruit.count()} items")
// This set has 3 items
}
アイテムがセット内にあるかを確認するには、in
演算子を使用します。
fun main() {
val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
println("banana" in readOnlyFruit)
// true
}
可変セットにアイテムを追加または削除するには、それぞれadd()
関数とremove()
関数を使用します。
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
を使用することです。
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
に割り当てることで、読み取り専用のビューを作成できます。kotlinval juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100) val juiceMenuLocked: Map<String, Int> = juiceMenu
マップ内の値にアクセスするには、インデックスアクセス演算子[]
とそのキーを使用します。
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
値が表示されます。kotlinfun 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値について説明します。
インデックスアクセス演算子[]
を使用して、可変マップにアイテムを追加することもできます。
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()
関数を使用します。
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()
関数を使用します。
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()
関数を使用します。
fun main() {
val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
println(readOnlyJuiceMenu.containsKey("kiwi"))
// true
}
マップのキーまたは値のコレクションを取得するには、それぞれkeys
プロパティとvalues
プロパティを使用します。
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]
}
keys
とvalues
はオブジェクトのプロパティの例です。オブジェクトのプロパティにアクセスするには、オブジェクトの後にピリオド.
を付けてプロパティ名を記述します。プロパティについては、クラスの章で詳しく説明しています。このツアーのこの時点では、そのアクセス方法を知っているだけで十分です。
キーまたは値がマップ内にあるかを確認するには、in
演算子を使用します。
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
「緑」の数字のリストと「赤」の数字のリストがあります。すべての数字が合計でいくつあるかを出力するコードを完成させてください。
fun main() {
val greenNumbers = listOf(1, 4, 23)
val redNumbers = listOf(17, 2)
// Write your code here
}
解答例
fun main() {
val greenNumbers = listOf(1, 4, 23)
val redNumbers = listOf(17, 2)
val totalCount = greenNumbers.count() + redNumbers.count()
println(totalCount)
}
演習 2
サーバーがサポートするプロトコルのセットがあります。ユーザーが特定のプロトコルを使用するよう要求しました。要求されたプロトコルがサポートされているかどうかをチェックするプログラムを完成させてください(isSupported
はBoolean値である必要があります)。
fun main() {
val SUPPORTED = setOf("HTTP", "HTTPS", "FTP")
val requested = "smtp"
val isSupported = // Write your code here
println("Support for $requested: $isSupported")
}
解答例
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までの整数を対応するスペルに関連付けるマップを定義してください。このマップを使用して、指定された数字のスペルを出力してください。
fun main() {
val number2word = // Write your code here
val n = 2
println("$n is spelt as '${<Write your code here >}'")
}
解答例
fun main() {
val number2word = mapOf(1 to "one", 2 to "two", 3 to "three")
val n = 2
println("$n is spelt as '${number2word[n]}'")
}