我正在使用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中有两个重复的词典。
任何人都可以帮助我使用设置或任何其他方法过滤重复项
答案 0 :(得分:2)
字典不符合Hashable
(或Equatable
),因此在这种情况下使用Set
不是一种可用的方法。但是,对于Key
和Value
类型为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)
之所以重复,是因为您添加了Dict1
和Dict2
2次。我可以问为什么?
Set
不适合您,因为Dictionary
类型不符合Hashable
协议,只符合其key
属性。
您可以对字典进行验证,如果已有类似的值,请不要将其附加到arrOfDict
。
答案 3 :(得分:-1)
你可以试试这个:
var set = NSSet(array: arrOfDict)