Swift之集合型別 (Collection Types)(集合篇)
集合(Sets)
集合(Set)用來儲存相同型別並且沒有確定順序的值。當 合元素順序不重要時或者希望確保每個元素只出現一次 時可以使用 合而不是陣列。注意:Swift的 Set 型別被橋接到 Foundation 中的 NSSet 類。
集合型別的雜湊值
一個型別為了儲存在 集合中,該型別必須是可雜湊化的--也就是說,該型別必須提供一個方法來計算它的雜湊 值。一個雜湊值是 Int
型別的,相等的物件雜湊值必須相同,比如 a==b
,因此必須 a.hashValue == b.hashValu e
。
Swift
的所有基本型別(比如 String
,Int
, Double
和 Bool
)預設都是可雜湊化的,可以作為 合的值的型別或 者字典的鍵的型別。沒有關聯值的列舉成員值(在列舉有講述)預設也是可雜湊化的。
合型別語法
Swift
中的 Set
型別被寫為Set<Element>
,這裡的 Element
表示 Set
中允許儲存的型別,和陣列不同的是, 合沒有等價的簡化形式。
建立和構造一個空的 集合
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.") // 列印 "letters is of type Set<Character> with 0 items."
注意:通過構造器,這裡的 letters 變數的型別被推斷為 Set<Character> 。
此外,如果上下文提供了型別資訊,比如作為函式的引數或者已知型別的變數或常量,我們可以通過一個空的數 組字面量建立一個空的 Set
:
letters.insert("a")
// letters 現在含有1個 Character 型別的值
letters = []
// letters 現在是一個空的 Set, 但是它依然是 Set<Character> 型別
用陣列字面量建立集合
你可以使用陣列字面量來構造 合,並且可以使用簡化形式寫一個或者多個值作為 合元素。
下面的例子建立一個稱之為favoriteGenres
的 合來儲存 String
型別的值:
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 被構造成含有三個初始值的 集合
這個favoriteGenres
變數被宣告為“一個 String
值的 合”,寫為 Set<String>
。由於這個特定的 合含有指 定 String
型別的值,所以它只允許儲存 String
型別值。這裡的 favoriteGenres
變數有三個 String 型別的初始 值("Rock"
,"Classical"
和 "Hip hop"
),並以陣列字面量的方式出現。
注意: favoriteGenres 被宣告為一個變數(擁有 var 標示符)而不是一個常量(擁有 let 標示符),因為它裡面的元素將 會在下面的例子中被增加或者移除。
一個 Set
型別不能從陣列字面量中被單獨推斷出來,因此Set
型別必須顯式宣告。然而,由於 Swift
的型別推 斷功能,如果你想使用一個陣列字面量構造一個Set
並且該陣列字面量中的所有元素型別相同,那麼你無須寫出Set
的具體型別。 favoriteGenres
的構造形式可以採用簡化的方式代替:
var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
由於陣列字面量中的所有元素型別相同,Swift
可以推斷出 Set<String>
作為 favoriteGenres
變數的正確型別。
訪問和修改一個集合
你可以通過 Set
的屬性和方法來訪問和修改一個 Set
。
為了找出一個Set
中元素的數量,可以使用其只讀屬性count
:
print("I have \(favoriteGenres.count) favorite music genres.") // 列印 "I have 3 favorite music genres.
使用布林屬性 isEmpty
作為一個縮寫形式去檢查 count
屬性是否為 0
:
if favoriteGenres.isEmpty {
print("As far as music goes, I'm not picky.")
} else {
print("I have particular music preferences.")
}
// 列印 "I have particular music preferences."
你可以通過呼叫 Set
的 insert(_:)
方法來新增一個新元素:
favoriteGenres.insert("Jazz")
// favoriteGenres 現在包含4個元素
你可以通過呼叫 Set
的 remove(_:)
方法去刪除一個元素,如果該值是該 Set
的一個元素則刪除該元素並且返回 被刪除的元素值,否則如果該Set
不包含該值,則返回 nil
。另外, Set
中的所有元素可以通過它的removeAl l()
方法刪除。
if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
// 列印 "Rock? I'm over it."
使用contains(_:)
方法去檢查Set
中是否包含一個特定的值:
遍歷一個集合
你可以在一個for-in
迴圈中遍歷一個 Set
中的所有值。
for genre in favoriteGenres {
print("\(genre)")
}
// Classical
// Jazz
// Hip hop
Swift
的 Set
型別沒有確定的順序,為了按照特定順序來遍歷一個 Set
中的值可以使用 sorted()
方法,它將返
回一個有序陣列,這個陣列的元素排列順序由操作符'<'
對元素進行比較的結果來確定.
for genre in favoriteGenres.sorted() {
print("(genre)")
}
// prints "Classical"
// prints "Hip hop"
// prints "Jazz
集合操作
你可以高效地完成 Set 的一些基本操作,比如把兩個 集合組合到一起,判斷兩個 合共有元素,或者判斷兩個 集合是否全包含,部分包含或者不相交。
基本集合操作
• 使用 intersection(:) 方法根據兩個 閤中都包含的值建立的一個新的 集合。
• 使用 symmetricDifference(:) 方法根據在一個 集合中但不在兩個 閤中的值建立一個新的 集合。 • 使用 union(:) 方法根據兩個集合的值建立一個新的集 合。
• 使用 subtracting(:) 方法根據不在該 閤中的值建立一個新的 集合。
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sort()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits. intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9] 以 singleDigitPrimeNumbers集合為標準,取出oddDigits集合中不在singleDigitPrimeNumbers的值
oddDigits. symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9] 取出兩個集合的並集去掉交集的集合
集合成員關係和相等
• 使用“是否相等”運算子( == )來判斷兩個 集合是否包含全部相同的值。
• 使用 isSubset(of:) 方法來判斷一個集 閤中的值是否也被包含在另外一個 閤中。
• 使用 isSuperset(of:) 方法來判斷一個 集合中包含另一個集合中所有的值。
• 使用 isStrictSubset(of:) 或者 isStrictSuperset(of:) 方法來判斷一個 合是否是另外一個集 合的子集 合或 者父集 合併且兩個集 合併不相等。
• 使用 isDisjoint(with:) 方法來判斷兩個集 合是否不含有相同的值(是否沒有交集)。
let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
相關文章
- # Swift 集合型別之迭代器Swift型別
- Java:Collection集合、泛型Java泛型
- Swift 整理(三)——字串、集合型別Swift字串型別
- Swift入坑系列—集合型別Swift型別
- 集合框架-Collection集合框架
- 集合框架-Collection集合-2框架
- 集合框架-Collection集合-3框架
- thinkphp5.x之Collection(集合)解析php集合PHP
- 集合框架-Collection集合總結框架
- Guava集合--新集合型別Guava型別
- Java集合-CollectionJava
- Why Swift? Generics(泛型), Collection(集合型別), POP(協議式程式設計), Memory Management(記憶體管理)Swift泛型型別協議程式設計記憶體
- List型別集合型別
- Swift,集合Swift
- 【開發篇plsql】plsql資料型別(一) 集合型別SQL資料型別
- [swift 進階]讀書筆記-集合型別協議 C3P5_專門的集合型別Swift筆記型別協議
- Java Collection集合面試題Java面試題
- 集合框架小結-Collection框架
- Collection集合的遍歷
- Android基礎之Java集合框架CollectionAndroidJava框架
- 【Java集合】單列集合Collection常用方法詳解Java
- PKG_COLLECTION_LHR 儲存過程或函式返回集合型別儲存過程函式型別
- Scala 中的集合(一):集合型別與操作型別
- Java集合 Collection、Set、Map、泛型 簡要筆記Java泛型筆記
- 集合------集合框架Collection/Iterator迭代器/增強for迴圈框架
- Java Collection介面 ArrayList集合(容器)Java
- Java 的 Collection 與 List 集合Java
- Java Collection、Map集合總結Java
- python-資料型別之set集合Python資料型別
- 1.1.5 python基本資料型別之集合Python資料型別
- Redis的集合型別(Set)Redis型別
- Java集合型別詳解Java型別
- pl/sql集合型別(一)SQL型別
- python 集合型別 setPython型別
- 十五個常用的 Laravel 集合(Collection)Laravel
- 15個常用的Laravel 集合(Collection)Laravel
- Java 集合深入理解(3):CollectionJava
- Redis五大資料型別之 Set(集合)Redis大資料資料型別