iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Software Development

成為一名 Kotlin 後端攻城獅系列 第 7

Day 7 資料結構-集合 (2)

  • 分享至 

  • xImage
  •  

昨天介紹了集合中的列表,今天來把剩下的集 (Set) 跟對映 (Map) 講完吧!

https://ithelp.ithome.com.tw/upload/images/20230922/20119910up79CiBmZC.png

集 (Set)

相似但不同於列表 (List),在一個集內每個元素至多只能存在一個,不同於列表可以重複數次。不過也就因為有如此特性,在進行不同集之間的元素比對時可以比使用列表更具有效率,在多數程式語言都會原生支援隊集的操作。在 Kotlin 當中就支援了:聯集 (Union)、交集 (Intersect) 跟 差集 (Subtract)。

https://ithelp.ithome.com.tw/upload/images/20230922/20119910NEaRAOfWrg.jpg

在 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 ,但在某些程式語言中,集運算可能會直接修改在集運算中的某一個變數上(常見為前者),這時就需多加留意。

對映 (Map)

對映相對於列表與集,雖然並不是可以迭代 (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]

參考資料


上一篇
Day6 資料結構-集合-列表
下一篇
Day 8 資料結構-集合新增刪除元素 (1)
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言