数组的唯一值在swift中
我正在用swift构buildiOS应用程序,我需要获取string数组的所有唯一值。
我一直在阅读苹果开发者文档,但它似乎没有一个function。
有人可以给我一个提示吗?
一种方法是使用一个集合:
let array = ["one", "one", "two", "two", "three", "three"] let unique = Array(Set(array)) // ["one", "two", "three"]
你也可以创build一个更明确地过滤数组的扩展:
extension Array where Element : Equatable { var unique: [Element] { var uniqueValues: [Element] = [] forEach { item in if !uniqueValues.contains(item) { uniqueValues += [item] } } return uniqueValues } }
注意
唯一的数组将以未指定的顺序排列,您可能需要对其进行sorting。 有时最好通过列举来自己做,你可以写一个扩展。
(Swift 2)可能是一个很好的延伸:
extension Array where Element : Hashable { var unique: [Element] { return Array(Set(self)) } }
有可能更多的优化方式来做你想要的,但这种方式是快速和容易的。
在Swift标准库中没有这样做的function,但是你可以写一个:
extension Sequence where Iterator.Element: Hashable { func unique() -> [Iterator.Element] { var seen: [Iterator.Element: Bool] = [:] return self.filter { seen.updateValue(true, forKey: $0) == nil } } } let a = ["four","one", "two", "one", "three","four", "four"] a.unique // ["four", "one", "two", "three"]
这有一个缺点,就是要求序列的内容是可排列的,而不仅仅是可以等同的,但是再次是大多数可比较的东西,包括string。
它也保留了原来的顺序,比如把内容放在字典或集合中,然后再把它们取出来。
我不知道有一个build造的方式。 这个通用函数可以做到这一点:
func distinct<S: SequenceType, E: Equatable where E==S.Generator.Element>(source: S) -> [E] { var unique = [E]() for item in source { if !contains(unique, item) { unique.append(item) } } return unique }
这里的缺点是这个解决scheme运行在O(n 2 )。
使用类似var unique = [<yourtype>:Bool]()
的字典,并在循环中填充像unique[<array value>] = true
。 现在unique.keys
拥有你所需要的。