Swift 3.0删除字典数组中的重复项

时间:2016-12-29 13:50:44

标签: arrays dictionary set swift3

我正在使用swift 3.0中的Dictionaries数组删除重复的Dictionaries

以下是

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"]]

正如您所看到的,arrOfDict中有两个重复的词典。

任何人都可以帮助我使用设置或任何其他方法过滤重复项

4 个答案:

答案 0 :(得分:2)

字典不符合Hashable(或Equatable),因此在这种情况下使用Set不是一种可用的方法。但是,对于KeyValue类型为Equatable的词典,我们可以访问==运算符,以便轻松执行词典数组的唯一性过滤:

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

E.g。如下(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 :(得分: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
}

答案 2 :(得分:0)

之所以重复,是因为您添加了Dict1Dict2 2次。我可以问为什么?

Set不适合您,因为Dictionary类型不符合Hashable协议,只符合其key属性。

您可以对字典进行验证,如果已有类似的值,请不要将其附加到arrOfDict

答案 3 :(得分:-1)

你可以试试这个:

var set = NSSet(array: arrOfDict)