2016-12-29 64 views
1
的陣列

我的工作在詞典中的SWIFT 3.0雨燕3.0刪除在詞典中

下面的數組移除重複的字典重複是

let Dict1 : [String : String] = ["messageTo":"Madhu"] 
let Dict2 : [String : String] = ["messageTo":"Kiran"] 
let Dict3 : [String : String] = ["messageTo":"Raju"] 

var arrOfDict = [[String:String]]() 
arrOfDict.append(Dict1) 
arrOfDict.append(Dict2) 
arrOfDict.append(Dict1) 
arrOfDict.append(Dict3) 
arrOfDict.append(Dict2 
print(arrOfDict) 

//prints [["messageTo": "Madhu"], ["messageTo": "Kiran"], ["messageTo": "Madhu"], ["messageTo": "Raju"], ["messageTo": "Kiran"]] 

正如你可以看到有2個重複的字典在arrOfDict中。

任何一個可以幫我在使用過濾重複設置或任何其他方式

+0

你好你找到解決辦法嗎?我面臨同樣的問題 –

+0

是的jigar dfri解決方案爲我工作。 –

回答

1

字典不符合Hashable(或Equatable),所以在這種情況下使用Set不是一種可用的方法。對於其中KeyValue類型是Equatable字典,然而,我們可以訪問==操作者容易地執行字典的陣列的獨特性過濾:

public func ==<Key : Equatable, Value : Equatable>(
      lhs: [Key : Value], rhs: [Key : Value]) -> Bool 

例如如下(O(n^2)

arrOfDict = arrOfDict.enumerated() 
    .filter { (idx, dict) in !arrOfDict[0..<idx].contains(where: {$0 == dict}) } 
    .map { $1 } 

print(arrOfDict) 
// [["messageTo": "Madhu"], ["messageTo": "Kiran"], ["messageTo": "Raju"]] 

// or ... 
arrOfDict = arrOfDict.enumerated() 
    .flatMap { (idx, dict) in !arrOfDict[0..<idx].contains(where: {$0 == dict}) ? dict : nil } 
-1

你可以試試這個:

var set = NSSet(array: arrOfDict) 
+0

我不認爲我們在Swift 3.0中需要'NS'了 – Honey

0

爲什麼它被複制,因爲你加Dict1的原因和Dict2 2次。請問爲什麼?

Set不會爲你工作,因爲Dictionary類型不符合Hashable協議,只有它的key屬性。

您可以對字典進行驗證,如果已經有這樣的值,請不要將它附加到arrOfDict

2
func removeDuplicates(_ arrayOfDicts: [[String: String]]) -> [[String: String]] { 
var removeDuplicates = [[String: String]]() 
var arrOfDict = [String]() 
for dict in arrayOfDicts { 
    if let name = dict["messageTo"], ! arrOfDict.contains(name) { 
     removeDuplicates.append(dict) 
     arrOfDict.append(name) 
    } 
} 
return removeDuplicates 
}