コレクション
プログラミングでは、後で処理するためにデータを構造体にグループ化できると便利です。Kotlinはまさにこの目的のためにコレクションを提供します。
Kotlinには、項目をグループ化するための以下のコレクションがあります。
コレクションの型 | 説明 |
---|---|
リスト | 順序付けされた項目のコレクション |
セット | 一意で順序付けされていない項目のコレクション |
マップ | キーが一意で1つの値にのみマップされるキーと値のペアのセット |
各コレクションの型はミュータブル(可変)または読み取り専用にすることができます。
リスト
リストは、項目を追加された順序で格納し、重複する項目を許可します。
読み取り専用リスト(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]
}
TIP
意図しない変更を防ぐために、ミュータブルリストをList
に代入することで、読み取り専用ビューを作成できます。
val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
val shapesLocked: List<String> = shapes
これはキャストとも呼ばれます。
リストは順序付けされているため、リスト内の項目にアクセスするには、インデックスアクセス演算子 []
を使用します。
fun main() {
val readOnlyShapes = listOf("triangle", "square", "circle")
println("リストの最初の項目は: ${readOnlyShapes[0]}")
// リストの最初の項目は: triangle
}
リストの最初または最後の項目を取得するには、それぞれ.first()
関数と.last()
関数を使用します。
fun main() {
val readOnlyShapes = listOf("triangle", "square", "circle")
println("リストの最初の項目は: ${readOnlyShapes.first()}")
// リストの最初の項目は: triangle
}
NOTE
.first()
関数と.last()
関数は、拡張関数の例です。オブジェクトで拡張関数を呼び出すには、オブジェクトの後にピリオド.
を付けて関数名を記述します。
拡張関数は、中級ツアーで詳細に説明されています。
現時点では、それらを呼び出す方法を知っていれば十分です。
リスト内の項目の数を取得するには、.count()
関数を使用します。
fun main() {
val readOnlyShapes = listOf("triangle", "square", "circle")
println("このリストには${readOnlyShapes.count()}項目があります")
// このリストには3つの項目があります
}
項目がリストに含まれているか確認するには、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
)を作成するには、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"
項目は削除されます。
TIP
意図しない変更を防ぐために、ミュータブルセットをSet
に代入することで、読み取り専用ビューを作成できます。
val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
val fruitLocked: Set<String> = fruit
NOTE
セットは順序付けされていないため、特定のインデックスで項目にアクセスすることはできません。
セット内の項目の数を取得するには、.count()
関数を使用します。
fun main() {
val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
println("このセットには${readOnlyFruit.count()}項目があります")
// このセットには3つの項目があります
}
項目がセットに含まれているか確認するには、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]
}
マップ
マップは項目をキーと値のペアとして格納します。キーを参照して値にアクセスします。マップは食べ物のメニューのようなものだと想像できます。食べ物(キー)を見つけることで、食べたいものの価格(値)を見つけることができます。リストのように数値インデックスを使用せずに値を検索したい場合に、マップは便利です。
NOTE
マップ内のすべてのキーは一意である必要があります。これにより、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}
}
TIP
意図しない変更を防ぐために、ミュータブルマップをMap
に代入することで、読み取り専用ビューを作成できます。
val 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("アップルジュースの値は: ${readOnlyJuiceMenu["apple"]}")
// アップルジュースの値は: 100
}
NOTE
マップ内に存在しないキーでキーと値のペアにアクセスしようとすると、null
値が表示されます。
fun main() {
// 読み取り専用マップ
val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
println("パイナップルジュースの値は: ${readOnlyJuiceMenu["pineapple"]}")
// パイナップルジュースの値は: 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("このマップには${readOnlyJuiceMenu.count()}キーと値のペアがあります")
// このマップには3つのキーと値のペアがあります
}
特定のキーがすでにマップに含まれているか確認するには、.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]
}
NOTE
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 = // 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 = // ここにコードを記述してください
val n = 2
println("$nは'${<ここにコードを記述してください>}'とスペルアウトされます")
}
|---|---|
fun main() {
val number2word = mapOf(1 to "one", 2 to "two", 3 to "three")
val n = 2
println("$n is spelt as '${number2word[n]}'")
}