如果我得到这个数组整体价值:删除重复和阵列
[0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
如何,我可以得到:
[2, 3, 4]
This answer将持有复制的价值,但我想删除该值以及。
如果我得到这个数组整体价值:删除重复和阵列
[0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
如何,我可以得到:
[2, 3, 4]
This answer将持有复制的价值,但我想删除该值以及。
如果要筛选仅出现1单次的数字,你可以用好老NSCountedSet
let nums = [0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
let countedSet = NSCountedSet(array: nums)
let uniques = nums.filter { countedSet.count(for: $0) == 1 }
print(uniques) // [2, 3, 4]
谢谢哥们 – NoKey
请注意,您需要导入基金会使用NSCountedSet。如果你需要一个纯粹的Swift解决方案来寻找一个数组的独特元素,你可以扩展数组,限制你的元素为Equatable协议,并检查是否可以而不是再次查找你的元素索引检查index(of:element)== nil使用索引(:)元素索引作为数组片从startIndex后:
extension Array where Element: Equatable {
var uniqueElements: [Element] {
var result: [Element] = []
forEach {
if let index = self.index(of: $0),
self[self.index(after: index)..<endIndex].index(of: $0) == nil {
print("item found only once")
result.append($0)
}
}
return result
}
}
如果您正在使用的Xcode 9•斯威夫特4,并不需要保持阵列原来的顺序,你可以利用新的字典初始值设定程序字典(grouping:,by :),并过滤键值等于1的键:
extension Array where Element: Hashable {
var uniqueElements: [Element] {
return Dictionary(grouping: self, by: { $0 })
.flatMap{ $1.count == 1 ? $0 : nil }
}
}
游乐场测试
let numbers = [0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
numbers.uniqueElements // [4, 2, 3]
如果你需要保持阵列顺序可以算元素出现如本answer和过滤事件等于一:
extension Array where Element: Hashable {
var uniqueElementsOrdered: [Element] {
return filter{ occurrences[$0] == 1 }
}
var occurrences: [Element:Int] {
return Dictionary(grouping: self, by: {$0})
.mapValues{ $0.count }
}
}
游乐场te蜇
let numbers = [0, 0, 1, 1, 1, 2, 3, 4, 5, 5]
numbers.uniqueElementsOrdered // [2, 3, 4]
谢谢,我将使用扩展! – NoKey
比较https://stackoverflow.com/q/41272542/2976878 – Hamish