【发布时间】:2017-03-27 13:08:53
【问题描述】:
我有一个重新调整数组的公式,例如 var Array = [a,s,d,s,f,g,g,h,e]。我想要的是运行for 循环或其他一些选项,让我返回a,s,d,f,g,h,e - 只有唯一值。如何使用 ios Swift 做到这一点?
【问题讨论】:
-
你关心元素的顺序吗?
标签: arrays swift sorting filter nsarray
我有一个重新调整数组的公式,例如 var Array = [a,s,d,s,f,g,g,h,e]。我想要的是运行for 循环或其他一些选项,让我返回a,s,d,f,g,h,e - 只有唯一值。如何使用 ios Swift 做到这一点?
【问题讨论】:
标签: arrays swift sorting filter nsarray
只需使用一个集合:
let set: Set = ["a", "s", "d", "s", "f", "g" , "g", "h", "e"]
print(set) // ["a", "s", "f", "g", "e", "d", "h"]
使用这个扩展,它允许您删除任何Sequence 的重复元素,同时保持顺序:
extension Sequence where Iterator.Element: Hashable {
func unique() -> [Iterator.Element] {
var alreadyAdded = Set<Iterator.Element>()
return self.filter { alreadyAdded.insert($0).inserted }
}
}
let array = ["a", "s", "d", "s", "f", "g" , "g", "h", "e"]
let result = array.unique()
print(result) // ["a", "s", "d", "f", "g", "h", "e"]
【讨论】:
O(1) 查找(需要快速contains(_:) 调用),而数组在一般情况下具有 O(n) 循环查找
insert(_:)。但我忽略了contains(_:)。
insert(_:) 也是固定时间。
Array.append(_:) 和Set.insert(_:) 哪个快。 Array.append(_:) 使用 Set.insert(_:) 的一半时间。当然,在这种情况下 Set 是最好的。 [swift.sandbox.bluemix.net/#/repl/58d9e75c50cb957f193a78d9]