2017-09-22 278 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