【Kotlin/Android Studio】Map/MutableMapの使い方!追加/取得などの操作方法
この記事からわかること
- Android Studio/KotlinのMap/MutableMapの使い方
- キーと値でデータを保持する
- 取得や追加、削除などの操作方法
- サイズや空かどうか、フィルタリング、ソート、forループ
index
[open]
\ アプリをリリースしました /
環境
- 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")
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。







