2016-12-29 63 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 
}