Swift-集合3_Sets

在實際使用 Set 和 Dictionary,要注意 Hashable 的限制,尤其是在建立自定義的類別的時候。

集合型別

  • 陣列( Array )
    • 是有序的集合
    • 索引從0開始
    • 元素要同一型態
  • 字典(Dictionary)
    • 元素以:key ⇒ value 的形式構成 ( 鍵 ⇒ 值 )
    • 通常是用 key 來進行存取
    • key 不能重覆
    • 無序的集合
    • 元素型態可不一樣
  • 集合( Sets )
    • 與陣列類似
    • 無序的集合
    • 集合內的值不可重複
    • 元素要同一型態
  • 元組( 雜堆 )( Tuple )
    • 元素有順序(可用 index 或 key)
    • 一旦決𤴓元素內容,就不能再更動
    • 元素、index 、key 不限型態,可以混用

集合(Sets)

集合(Set)用來儲存相同型別且沒有順序、沒有重複的值,當順序不重要或是需要每個值只能出現一次時,可以選擇使用Set。

宣告Set型別

使用Set宣告
Element表示Set中儲存的型別:


var mySet: Set<String>

也可以在宣告時直接填入值

var anotherSet: Set<String> = ["Rock", "Classical", "Hip hop"]

測試


///創建一個空的 Set
var mySet = Set<Int>()

// 也可以在宣告時直接填入值
var anotherSet: Set<String> = ["Rock", "Classical", "Hip hop"]

// 指派為一個空 Set, 雖然長得跟陣列使用方法一樣
// 但因為前面已經有明確宣告是 Set, 所以這仍然是 Set<String> 型別
anotherSet
anotherSet = []

// Set 所含的值的數量
// 因為目前是空 Set,印出:0
print(anotherSet.count)

// 使用 isEmpty 檢查 Set 內是否有值
if anotherSet.isEmpty {
    print("Empty !")
} else {
    print("Not empty !")
}

加入或移除 Set 內的值


// 宣告給值
var mySet: Set<String> = ["Rock", "Classical"]

// 使用 insert 來加入新的值
mySet.insert("Hip hop")

mySet

// 目前為 ["Rock", "Classical", "Hip hop"] (無順序)
// 使用 remove來移除一個值
// 如果這個值是 mySet 裡的一個值, 會移除掉這個值並返回此值
// 如果不存在裡面的話 則是返回 nil
mySet.remove("Rock")
mySet

// 使用 contains 來檢查 Set 裡是否包含一個特定的值
if mySet.contains("Classical") {
    print("Classical is here !")
} else {
    print("Not Here !")
}

// 使用 removeAll() 來移除其內所有的值
mySet.removeAll()
mySet

使用 for-in 抓出(遍歷)Set中的所有值

var mySet: Set<String> = ["Tom" ,"Oli", "John","Peter"]
for item in mySet {
    print(item)
}

集合(Sets)操作

Swift 提供幾個方法,依兩個 Set 是否有交集與否來創建新的 Set:

  • intersect 創建一個新的 Set,其內的值為兩個 Set 中都包含的值。(交集)
  • symmetricDifference 創建一個新的 Set,其內的值為兩個 Set 都不存在的值。(非交集)
  • union 創建一個新的 Set,其內的值為兩個 Set 中所有的值。(聯集)
  • subtract 創建一個新的 Set,其內的值只有 aSet ,並扣除 ab 交集處。

範例



let a:Set = ["1","2","3"]
let b:Set = ["2","3","4"]

//a和b都有的
print(a.intersection(b))

//不在a,也不在b
print(a.symmetricDifference(b))

//a和b加起来的所有值,但不會重覆
print(a.union(b))

//屬於a,去除包括b的部份
print(a.subtracting(b))