昨天介紹了集合中的列表,今天來把剩下的集 (Set) 跟對映 (Map) 講完吧!
相似但不同於列表 (List),在一個集內每個元素至多只能存在一個,不同於列表可以重複數次。不過也就因為有如此特性,在進行不同集之間的元素比對時可以比使用列表更具有效率,在多數程式語言都會原生支援隊集的操作。在 Kotlin 當中就支援了:聯集 (Union)、交集 (Intersect) 跟 差集 (Subtract)。
在 Kotlin 中我們可以這樣操作
聯集
val list1 = setOf(1, 2 ,3, 5, 8, -1)
val list2 = setOf(1, 1, 2, 2 ,3, 5)
// = setOf(1, 2, 3, 5)
println(list1 union list2) // [1, 2, 3, 5] <-- LinkedHashSet
交集
val list1 = setOf(1, 2 ,3, 5, 8, -1)
val list2 = setOf(1, 2, 3, 5)
println(list1 intersect list2) // [1, 2, 3] <-- LinkedHashSet
差集
val list1 = setOf(1, 2 ,3, 5, 8, -1)
val list2 = setOf(1, 2, 3, 5)
println(list1 subtract list2) // [8, -1] <-- LinkedHashSet
println(list2 subtract list1) // [] <-- LinkedHashSet
注意1:這些集的操作在 Kotlin 中也可以被用在列表上,但要非常注意,如果列表中有重複元素,那麼這些重複的元素將 被視為一個 儘管回傳仍圍城列表型別。所以筆者這裡比較偏好如果要做集運算,就先將資料結構選定為集而非列表,如此也可以避免誤用。
注意2:對集進行集運算時,結果會透過回傳值返回,所以上面範例我們可以安心使用 val
,但在某些程式語言中,集運算可能會直接修改在集運算中的某一個變數上(常見為前者),這時就需多加留意。
對映相對於列表與集,雖然並不是可以迭代 (Iterable) 的物件,但在 Kotlin 當中仍屬於集合 (Collection) 的一員。對映使用鍵值對 (key-value pair) 來儲存一個元素 (Entry),在建立之時,鍵 (Key) 在同一個對映中只能是唯一值,但值就可以在對映中重複出現於不同的鍵中。
下面我們先看對映宣告的方式
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
// {"key1": 1, "key2": 2, "key3": 3, "key4": 4} <-- Python-dictionary-like expression
延續上面宣告,儲存完資料接下來就是取值與修改
println(numbersMap.get("key1")) // 1
println(numbersMap["key1"]) // 1
println(numbersMap.getOrDefault("key5", 10)) //10
println(numbersMap.getOrElse("Key5", {10/2})) // 5 <-- 可以給一個函式在第二參數
println(numbersMap["key5"]) // null
//numbersMap.getValue("key5") // exception!
println(numbersMap.keys) // [key1, key2, key3, key4]
println(numbersMap.values) // [1, 2, 3, 1]