[HeadFirst] Kotlin collections::Map
14503 ワード
Mapはkeyとvalueからなる資料構造である.重複するvalueは持つことができますが、重複するkeyは持つことができません.
Mapの活用
Mapの活用
class Recipe (val title: String) {}
fun main() {
val myMap: Map<String, Recipe> = mapOf("R1" to Recipe("Soup"), "R2" to Recipe("Steak"))
println(myMap.containsKey("R1")) // true
println(myMap.containsValue(Recipe("Soup"))) // false
println(myMap.get("R1")?.title) // Soup
println(myMap.get("R3")?.title) // null
println(myMap.getValue("R1").title) // soup
println(myMap.getValue("R3").title) // NoSuchElementException
}
マッピングの作成
mapを初期化するにはkey、value pairを入れる必要があります.この場合、key値はtoを使用して、どの値のkeyであるかを指定する必要があります.
特定の値を保持するかどうか
containsKey()とcontainsValue()を使用して、対応する値があるかどうかを確認できます.myMap.containsValue(Recipe("Soup"))
の結果はfalseであり,containsValue()も内部で=,equals()を用いていると推測できる.class Recipe (val title: String) {
override fun hashCode(): Int {
return title.hashCode()
}
override fun equals(other: Any?): Boolean {
return this.hashCode() == other.hashCode()
}
}
RecipeクラスでhashCode()とequals()を上書きし、myMap.containsValue(Recipe("Soup"))
に戻ります.結果はtrueです.titleが同じであれば、参照値にかかわらず等価とみなされます.
get, getValue
get()関数はnull(指定されたキー値が見つからない場合)を返し、getValue()関数は「例外」(Exception)を生成します.
loop
List,Setとは異なり,Mapが格納する値はKey,Value Pairである.同じ方法でloopを回転すると、戻りますが、私たちが望んでいる値は表示されないかもしれません.これらの情報が出力されるからです. for (item in myMap) {
println(item)
}
//R1=Recipe@276a17
//R2=Recipe@4c7e12e
for ((key, value) in myMap) {
println("$key=$value")
}
逆に、2番目を文として構成すると、keyとvalueにアクセスできます.
MuatableMap
mutableMapを作成するには、mutableMapOf()関数を使用します.put
を用いて内容物を添加してもよいし、assignment
を用いて内容物を添加してもよい.IntelliJは配分方法を推奨しているようです.これはJavaで検索するとsetを利用してmapの内容を変えるのですが、どんな違いがありますか?kotlinドキュメントにおいてもPUTが用いられており、割当方式に変換しなければならない理由は説明されていない.remove()
を使用して内容物を除去することができる.
本来はputを使ってmapにコンテンツを追加することができますが、配分方式に変換することをお勧めします.fun main() {
val myMap: Map<String, Recipe> = mapOf("R1" to Recipe("Soup"), "R2" to Recipe("Steak"))
val mutableMap = mutableMapOf("R3" to Recipe("Kimchi"), "R4" to Recipe("SoonDae"))
mutableMap.put("R5", Recipe("Ramen"))
mutableMap["R6"] = Recipe("Galbijjim") // recommended...but Why?
mutableMap.putAll(myMap)
mutableMap.remove("R4")
mutableMap.remove("R3", Recipe("Kimchi"))
mutableMap.clear()
}
Map copy
やはりMapはcopyを作成することもできます.特にリストに変更してもいいですが、結果はこうです.各マッピングのキーと値のペアを要素として含むリストが作成されます.(R5, Recipe@4b14527)
(R6, Recipe@79a2245d)
(R1, Recipe@276a17)
(R2, Recipe@4c7e12e)
また、entries
というpropertyを使用するとmapの内容物をsetに戻すことができ、mutableMapで使用するとmutableSetに戻り、逆にsetに戻る.keys propertyを使用してkeyのseyを取得し、valuesを使用してvaluesのGeneric Collectionを取得することもできます.返される資料構造が可変であるかどうかは,地図の性質に依存する.
keys、values propertyは、copyではなく、実際のマッピングを構成する要素です.mutable mapからインポートされたpropertyの場合は、変更によってmapを更新できます.
集合に関する質問
どうして可変でなくても可変ではいけないのですか?
可変で変更不可能なコレクションは、他のコードで更新されるエラーを防止します.
変数を書いていますが、別の分野でimmutableで表示する必要がありますか?
val x = mutableSet(1, 2,)
val y: Set<Int> = x
yのみが表示されている場合は、同じコンテンツを更新不可能なバージョンとして表示できます.
Reference
この問題について([HeadFirst] Kotlin collections::Map), 我々は、より多くの情報をここで見つけました
https://velog.io/@tjeong/Kotlin-collections-Map
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
class Recipe (val title: String) {}
fun main() {
val myMap: Map<String, Recipe> = mapOf("R1" to Recipe("Soup"), "R2" to Recipe("Steak"))
println(myMap.containsKey("R1")) // true
println(myMap.containsValue(Recipe("Soup"))) // false
println(myMap.get("R1")?.title) // Soup
println(myMap.get("R3")?.title) // null
println(myMap.getValue("R1").title) // soup
println(myMap.getValue("R3").title) // NoSuchElementException
}
class Recipe (val title: String) {
override fun hashCode(): Int {
return title.hashCode()
}
override fun equals(other: Any?): Boolean {
return this.hashCode() == other.hashCode()
}
}
for (item in myMap) {
println(item)
}
//R1=Recipe@276a17
//R2=Recipe@4c7e12e
for ((key, value) in myMap) {
println("$key=$value")
}
fun main() {
val myMap: Map<String, Recipe> = mapOf("R1" to Recipe("Soup"), "R2" to Recipe("Steak"))
val mutableMap = mutableMapOf("R3" to Recipe("Kimchi"), "R4" to Recipe("SoonDae"))
mutableMap.put("R5", Recipe("Ramen"))
mutableMap["R6"] = Recipe("Galbijjim") // recommended...but Why?
mutableMap.putAll(myMap)
mutableMap.remove("R4")
mutableMap.remove("R3", Recipe("Kimchi"))
mutableMap.clear()
}
(R5, Recipe@4b14527)
(R6, Recipe@79a2245d)
(R1, Recipe@276a17)
(R2, Recipe@4c7e12e)
どうして可変でなくても可変ではいけないのですか?
可変で変更不可能なコレクションは、他のコードで更新されるエラーを防止します.
変数を書いていますが、別の分野でimmutableで表示する必要がありますか?
val x = mutableSet(1, 2,)
val y: Set<Int> = x
yのみが表示されている場合は、同じコンテンツを更新不可能なバージョンとして表示できます.Reference
この問題について([HeadFirst] Kotlin collections::Map), 我々は、より多くの情報をここで見つけました https://velog.io/@tjeong/Kotlin-collections-Mapテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol