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))