【Kotlin/Android Studio】Map/MutableMapの使い方!追加/取得などの操作方法
この記事からわかること
- Android Studio/KotlinのMap/MutableMapの使い方
- キーと値でデータを保持する
- 取得や追加、削除などの操作方法
- サイズや空かどうか、フィルタリング、ソート、forループ
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Android:13
- Kotlin:1.8.20
Mapとは?
KotlinのMap
とはList
などと同じようにデータを複数保持できるコレクション型の1つとして定義されたデータ型です。Map
はキー(Key)と値(Value)の2つのペアでデータを保持する特徴があります。
Swiftなど他の言語では辞書(Dictionary)型などと呼ばれていることが多いです。
KotlinのMap
はSwiftの辞書型とは異なり、順序を保持することができます。またキーと値はNullableになっているのでnull
を含めることが可能になっています。また不変(Immutable)なコレクションであるMap
と可変な(Mutable)コレクションであるMutableMap
に分かれています。
定義方法
Map
は不変(Immutable)なコレクションであるとして定義されており、要素の変更や追加ができません。インスタンスを生成するにはmapOf
メソッドを使用し、key to value
の形式で記述していきます。
var user = mapOf("name" to "ame","place" to "東京都")
print(user) // {name=ame, place=東京都}
またキーには異なるデータ型を指定することも可能です。
var user = mapOf("name" to "ame", 100 to "東京都")
print(user) // {name=ame, 100=東京都}
値を取得する
Map
内のデータを取得するには[キー]
形式でキーを指定します。存在しないキーを指定した場合はnull
が返ります。
var user = mapOf("name" to "ame", 100 to "東京都")
print(user["name"]) // ame
print(user[100]) // 東京都
print(user[1]) // null
MutableMapとは?
一方MutableMap
は可変な(Mutable)コレクションとして定義されており、要素の変更や追加が可能になっています。そのため要素を追加するためのput
メソッドや削除するためのremove
メソッドが用意されています。
定義方法
インスタンスを生成するにはmutableMapOf
メソッドを使用し、key to value
の形式で記述していきます。
var user = mutableMapOf("name" to "ame", "place" to "東京都")
追加する
要素を追加したい場合はキー
を指定して格納するだけです。
var user = mutableMapOf("name" to "ame", "place" to "東京都")
user["age"] = "20"
print(user) // {name=ame, place=東京都, age=20}
他にもput
メソッドやputAll
メソッドを使用して追加することが可能です。
var user = mutableMapOf("name" to "ame", "place" to "東京都")
user.put("age", "20")
print(user) // {name=ame, place=東京都, age=20}
var user = mutableMapOf("name" to "ame", "place" to "東京都")
user.putAll(mapOf("age" to "20", "hobby" to "tennis"))
print(user) // {name=ame, place=東京都, age=20, hobby=tennis}
削除する
要素を削除したい場合はremove
メソッドの引数にキー
を指定します。
var user = mutableMapOf("name" to "ame", "place" to "東京都")
user.remove("place")
print(user) // {name=ame}
-=
演算子を使用しても削除することが可能です。
var user = mutableMapOf("name" to "ame", "place" to "東京都")
user -= "place"
print(user) // {name=ame}
条件でフィルタリングする
ここからはMap/MutableMap
の両方に利用できるメソッドを紹介していきます。
条件を指定して要素をフィルタリングしたい場合はfilter
メソッドを使用します。引数には絞り込みたい条件を渡します。以下の動作を見ると分かりますが、filter
メソッドは元のインスタンスを変更しません。
var date = mutableMapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
date.filter { it.value > 80 }
print(date) // {2024/1/17=100, 2024/1/18=60, 2024/1/19=80, 2024/1/20=90}
そのため変数に格納することでフィルタリングされたリストのコピーを取得することができます。取得したリストはイミュータブルなMap
なのでミュータブルにしたい場合はtoMutableMap
メソッドを使用して変換することができます。
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
var filteringDate = date.filter { it.value > 80 }.toMutableMap()
print(filteringDate) // {2024/1/17=100, 2024/1/20=90}
要素数を取得する:size
コレクションの要素数はsize
プロパティから取得できます。
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
print(date.size) // 4
中身が空か確認する:isEmpty
中身が空か確認するにはisEmpty
メソッドを使用します。空であればtrue
を返します。またisNotEmpty
メソッドはその逆です。
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
print(date.isEmpty()) // false
print(date.isNotEmpty()) // true
含まれているか確認する:contains
コレクションの中に要素が含まれているか確認するにはcontains(element: T)
メソッドを使用します。引数に対象の要素を渡します。
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
print(date.contains("2024/1/18")) // true
ソートする:toSortedMap
コレクション内をソートするにはtoSortedMap
メソッドを指定します。
var date = mapOf("2024/1/19" to 80, "2024/1/17" to 100, "2024/1/20" to 90, "2024/1/18" to 60)
var sortedMap = date.toSortedMap()
print(sortedMap) // {2024/1/17=100, 2024/1/18=60, 2024/1/19=80, 2024/1/20=90}
条件でソートする:sortedBy
条件をつけて並び替えたい場合はentries
プロパティからエントリーを取得してsortedBy
メソッドを使用します。
var date = mapOf("2024/1/19" to 80, "2024/1/17" to 100, "2024/1/20" to 90, "2024/1/18" to 60)
var sortedMap = date.entries.sortedBy { it.value }
print(sortedMap) // [2024/1/18=60, 2024/1/19=80, 2024/1/20=90, 2024/1/17=100]
中身を繰り返し取り出す:for
Map
の中身を繰り返し取り出すにはいくつか方法があります。
forループ
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
for ((key, value) in date) {
print("key: $key, Value: $value")
}
forEach
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
date.forEach { key, value ->
print("key: $key, Value: $value")
}
キー/値のみを取り出す
var date = mapOf("2024/1/17" to 100, "2024/1/18" to 60, "2024/1/19" to 80, "2024/1/20" to 90)
for (key in date.keys) {
println("Key: $key, Value: ${date[key]}")
}
for (value in date.values) {
println("Value: $value")
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。