[HeadFirst] Kotlin collections::Map

14503 ワード

Mapはkeyとvalueからなる資料構造である.重複するvalueは持つことができますが、重複するkeyは持つことができません.

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のみが表示されている場合は、同じコンテンツを更新不可能なバージョンとして表示できます.