2017-09-22 141 views
1

如果我得到这个数组整体价值:删除重复和阵列

[0, 0, 1, 1, 1, 2, 3, 4, 5, 5] 

如何,我可以得到:

[2, 3, 4] 

This answer将持有复制的价值,但我想删除该值以及。

+0

比较https://stackoverflow.com/q/41272542/2976878 – Hamish

回答

2

如果要筛选仅出现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] 
+1

谢谢哥们 – NoKey

3

请注意,您需要导入基金会使用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] 
+1

谢谢,我将使用扩展! – NoKey