这里每天共享一个 iOS 的新知识,快来重视我吧
前语
从数组中删去重复项是一项常见的任务,在 Swift 中,规范库没有直接提供一个体系函数给咱们,有必要自己完成这样的办法。
完成数组去重的办法有许多,今日来介绍一些常用的办法。
1、运用 Set 去重
Set
也是一个调集,仅仅它不包括重复项,运用这个特色,咱们能够简单的给一个数组去重:
letarray:[Int]=[1,1,3,3,2,2]
letset:Set<Int>=Set(array)
print(set)
上边的代码会打印去重之后的 [1, 2, 3],但成果也可能是 [3, 1, 2],也可能是 [3, 2, 1],这就涉及到 Set 的原始设计了,它内部的元素是无序的,不能确保固定的次序,假如你对次序有要求,就不能用 Set 来完成了。
2、巧用字典去重
咱们都知道字典中是无法存储相同 Key
的,也就能够运用 Key
的唯一性往来不断重:
letarray:[Int]=[1,1,3,3,2,2]
vardic:[Int:Int]=[:]
array.forEach{dic[$0]=0}
print(dic.keys)
先把 array 遍历一遍,所有元素作为字典的 key 存储起来,最后再取 dic.keys
获得去重之后的数组。
但是字典的 key 也相同是无序的,并且运用字典会带来额定的功能开支,因此不推荐这种方式。
上边提到这两种计划都无法确保次序,假如需求确保去重后的次序和原数组保持一致,请看下边的几个计划。
3、运用 NSOrderedSet
NSOrderedSet
是 OC 年代的产物,承继自 NSObject
,它能够像Set 相同完成去重,也能够确保次序:
letarray:[Int]=[1,1,3,3,2,2]
letorderSet=NSOrderedSet(array:array)
print(orderSet.array)
最终打印 [1, 2, 3],次序和原数组保持一致,但是需求留意这玩意功能比 Set
差许多。
4、遍历数组去重
这也是最符合直觉的办法,把数组遍历一遍,创立个新数组,假如这个元素没有参加新数组就加进去,假如加过了就抛掉:
letarray:[Int]=[1,1,3,3,2,2]
varnewArray:[Int]=[]
array.forEach{itemin
if!newArray.contains(item){
newArray.append(item)
}
}
print(newArray)
最终打印 [1, 3, 2],也是保持次序的。
为了更方便调用还能够将这个办法写个数组扩展:
extensionArraywhereElement:Hashable{
varunique:Self{
varnewArray:Self=[]
forEach{elein
if!newArray.contains(ele){
newArray.append(ele)
}
}
returnnewArray
}
}
这样调用的时分就方便了:
letarray:[Int]=[1,1,3,3,2,2]
print(array.unique)//[1,3,2]
5、filter 高阶函数 + Set
Set
在刺进元素的时分调用 insert
函数,这个函数回来一个元组,第一个值是一个 Bool
类型代表是否刺进成功,假如现已包括了这个元素则不能刺进成功,另一个是被刺进的这个元素,这在 Set
的函数声明中能够看得出来:
funcinsert(_newMember:Element)->(inserted:Bool,memberAfterInsert:Element)
咱们能够运用这个特性,再加上 filter 这个高阶函数,来给调集 Array
写一个扩展:
extensionArraywhereElement:Hashable{
varunique:Self{
varseen:Set<Element>=[]
returnfilter{seen.insert($0).inserted}
}
}
调用办法和上边的方式相同。
点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识
本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这里仅仅同步,想要及时学到就来重视我吧!