先上圖:
注意:這個(gè)去重方法不能保證去重后的順序和原數(shù)組一致及汉!
沒看懂提佣?沒關(guān)系,下面來干貨~
這個(gè)代碼的關(guān)鍵在于用到了集合Set
的一種屬性:存儲(chǔ)相同類型的不同的值
集合類型
Swift語言提供經(jīng)典的數(shù)組 和字典 兩種集合類型來存儲(chǔ)集合數(shù)據(jù).數(shù)組和字典中存儲(chǔ)的數(shù)據(jù)值類型必須明確.這意味著我們不能把不正確的數(shù)據(jù)類型插入其中.
Swift對顯式類型集合的使用確保了我們的代碼對工作所需要的類型非常清楚.也讓我們在開發(fā)中可以早早的找到任何的類型不匹配錯(cuò)誤.如果你用變量(var)
創(chuàng)建的集合,這些集合就是可變的(增刪改).如果用常量(let)
創(chuàng)建的,這些集合是不能被操作的.
注意: 如果集合的元素是不變的,那就將集合聲明為常量.這樣Swift編譯器能對你創(chuàng)建的集合做性能優(yōu)化.
Set:
一個(gè)set無序的存儲(chǔ)相同類型的不同的值.當(dāng)一個(gè)數(shù)組元素的順序不重要或者你需要保證這些value只出現(xiàn)一次的時(shí)候使用set.-
語法:
Set<SomeType>
和array不同的是,set沒有縮寫方式.var someSet = Set<Character>()
或者如果上下文以及提供了類型信息,比如一個(gè)函數(shù)的參數(shù)或者一個(gè)已知類型的常量或變量.你可以創(chuàng)建用空的數(shù)組字面量創(chuàng)建一個(gè)空的var someSet =Set<Character>() // someSet現(xiàn)在包含一個(gè)Character的值 someSet.insert("a") // someSet現(xiàn)在是一個(gè)空的set,但是它仍然是一個(gè)存儲(chǔ)Character的set. someSet = [] //可以直接使用數(shù)組字面量初始化一個(gè) var someSet:Set<String> = ["L","o","v","e"]
一個(gè)set不能單獨(dú)的從數(shù)組字面量推斷類型.所以set必須被明確的定義.然而根據(jù)swift的類型推斷,當(dāng)你用數(shù)組字面量初始化set的時(shí)候,如果包含的所以value是一種類型,你可以不寫類型.
var someSet: Set = ["L","o","v","e"] //判斷一個(gè)set是否包含一個(gè)值
var isContainAValue = someSet.contains("o")
print("/(isContainAValue)") //遍歷一個(gè)set
for item in someSet {
print("/(item)")
}// 因?yàn)閟et類型沒有順序.所以要按照一個(gè)指定的順序遍歷set要使用全局sorted函數(shù).
for item in someSet.sort() {
print("/(item)")
}
-
Set關(guān)系
你可以效率很高的進(jìn)行一下set操作.比如合并兩個(gè)set.獲取兩個(gè)集合的相同部分.或者判斷兩個(gè)集合包含所以的,一些或者都不包含一些值.
// set的一些基本操作
let oddDigits:Set = [1,3,5,7,9]
let evenDigits:Set = [0,2,4,6,8]
let sigleDigitPrimeNumber:Set = [2,3,5,7]
// 并集
let unionResult = oddDigits.union(evenDigits).sort()
print("\(unionResult)")
//[0,1,2,3,4,5,6,7,8,9]
// 交集
let intersectResult = oddDigits.intersect(evenDigits).sort()
print("\(intersectResult)")
// []
// 前一個(gè)包含,后一個(gè)不包含的元素
let subtractResult = oddDigits.subtract(sigleDigitPrimeNumber).sort()
print("\(subtractResult)")
// [1, 9]
// 在前一個(gè)或者后一個(gè)set里面,但是去掉同時(shí)包含的元素
let exclusiveOrResult = oddDigits.exclusiveOr(sigleDigitPrimeNumber).sort()
print("\(exclusiveOrResult)")
// [1, 2, 9]
-
Set比較
// 集合比較 let houseAnimal: Set = ["??", "??"] let houseAnimalCopy: Set = ["??", "??"] let farmAnimals: Set = ["??", "??", "??", "??", "??", "??"] let cityAnimal: Set = ["??", "??"] // "==" 判斷是否包含完全相同的元素,不是地址指針一樣 let isEqualOf: Bool = houseAnimal == houseAnimalCopy print("\(isEqualOf)") // true // 是不是子集 let isSubsetOf: Bool = houseAnimal.isSubsetOf(farmAnimals) print("\(isSubsetOf)") // true // 是不是超集 let isSupersetOf: Bool = farmAnimals.isSupersetOf(houseAnimal) print("\(isSupersetOf)") // true // 不想交 let isDisjoinWith: Bool = farmAnimals.isDisjointWith(cityAnimal) print("\(isDisjoinWith)") // true // isStrictSubsetOf 嚴(yán)格子集關(guān)系 屬于但不相等 同isStrictSupersetOf let isStrictSubsetOf: Bool = houseAnimalCopy.isStrictSubsetOf(houseAnimal) print("\(isStrictSubsetOf)") // false