コレクション
プログラミングにおいて、後で処理するためにデータを構造体にグループ化できると便利です。Kotlinでは、まさにこの目的のためにコレクションを提供しています。
Kotlinには、項目をグループ化するための以下のコレクションがあります:
| コレクション型 | 説明 |
|---|---|
| リスト(Lists) | 項目の順序付けられたコレクション |
| セット(Sets) | 重複のない、順序のない項目のコレクション |
| マップ(Maps) | キーが一意で、1つの値にのみマップされるキーと値のペアのセット |
各コレクション型には、可変(mutable)または読み取り専用(read only)があります。
リスト (List)
リストは、追加された順序で項目を保存し、重複する項目を許可します。
読み取り専用リスト (List) を作成するには、 listOf() 関数を使用します。
可変リスト (MutableList) を作成するには、 mutableListOf() 関数を使用します。
リストを作成する際、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]
}不要な変更を防ぐために、可変リストを
Listに代入することで、読み取り専用のビューを作成できます:kotlinval shapes: MutableList<String> = mutableListOf("triangle", "square", "circle") val shapesLocked: List<String> = shapesこれはキャスト(casting)とも呼ばれます。
リストは順序付けられているため、リスト内の項目にアクセスするには、インデックスアクセス演算子 [] を使用します:
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()関数は拡張(extension)関数の例です。オブジェクトに対して拡張関数を呼び出すには、オブジェクトの後にピリオド.を付けて関数名を書きます。拡張関数については、中級ツアーで詳しく説明します。 現時点では、呼び出し方を知っておくだけで十分です。
リスト内の項目数を取得するには、.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")
// リストに "pentagon" を追加
shapes.add("pentagon")
println(shapes)
// [triangle, square, circle, pentagon]
// リストから最初の "pentagon" を削除
shapes.remove("pentagon")
println(shapes)
// [triangle, square, circle]
}セット (Set)
リストが順序付けられ、重複した項目を許可するのに対し、セットは順序がなく、一意(ユニーク)な項目のみを保存します。
読み取り専用セット (Set) を作成するには、 setOf() 関数を使用します。
可変セット (MutableSet) を作成するには、 mutableSetOf() 関数を使用します。
セットを作成する際、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" 項目は破棄されます。
不要な変更を防ぐために、可変セットを
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") // セットに "dragonfruit" を追加
println(fruit) // [apple, banana, cherry, dragonfruit]
fruit.remove("dragonfruit") // セットから "dragonfruit" を削除
println(fruit) // [apple, banana, cherry]
}マップ (Map)
マップは項目をキーと値のペア(key-value pairs)として保存します。キーを参照することで値にアクセスします。マップは食べ物のメニューのようなものだと想像してください。食べたい料理(キー)を見つけることで、その価格(値)を知ることができます。マップは、リストのように番号付きのインデックスを使用せずに、特定の値を検索したい場合に便利です。
- マップ内のすべてのキーは一意である必要があります。これにより、Kotlinは取得したい値を正しく特定できます。
- マップ内で値を重複させることは可能です。
読み取り専用マップ (Map) を作成するには、 mapOf() 関数を使用します。
可変マップ (MutableMap) を作成するには、 mutableMapOf() 関数を使用します。
マップを作成する際、Kotlinは保存されている項目の型を推論できます。型を明示的に宣言するには、マップ宣言の後の山括弧 <> 内にキーと値の型を追加します。例えば、MutableMap<String, Int> のようになります。この場合、キーの型は String で、値の型は Int です。
マップを作成する最も簡単な方法は、各キーとそれに関連する値の間に to を使用することです:
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}
}不要な変更を防ぐために、可変マップを
Mapに代入することで、読み取り専用のビューを作成できます:kotlinval juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100) val juiceMenuLocked: Map<String, Int> = juiceMenu
マップ内の値にアクセスするには、インデックスアクセス演算子 [] にキーを指定して使用します:
fun main() {
// 読み取り専用マップ
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() { // 読み取り専用マップ 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 // キー "coconut"、値 150 をマップに追加
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") // マップからキー "orange" を削除
println(juiceMenu)
// {apple=100, kiwi=190}
}マップ内の項目数を取得するには、.count() 関数を使用します:
fun main() {
// 読み取り専用マップ
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
// 代わりに、keys プロパティを使用しなくても確認できます
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)
// ここにコードを書いてください
}解答例
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 = // ここにコードを書いてください
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 = // ここにコードを書いてください
val n = 2
println("$n is spelled as '${<ここにコードを書いてください >}'")
}解答例
fun main() {
val number2word = mapOf(1 to "one", 2 to "two", 3 to "three")
val n = 2
println("$n is spelt as '${number2word[n]}'")
}