【问题标题】:Swift 3.0 Remove duplicates in Array of DictionariesSwift 3.0 删除字典数组中的重复项
【发布时间】:2016-12-29 13:50:43
【问题描述】:

我正在 swift 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"]]

如您所见,arrOfDict 中有 2 个重复的字典。

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

【问题讨论】:

  • 您好,您找到解决方案了吗?我也面临同样的问题
  • 是的 jigar dfri 解决方案对我有用。

标签: arrays dictionary set swift3


【解决方案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 }

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      【解决方案3】:

      之所以重复,是因为你加了Dict1Dict2 2次。请问为什么?

      Set 不适合你,因为Dictionary 类型不符合Hashable 协议,只有它的key 属性。

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

      【讨论】:

        【解决方案4】:

        你可以试试这个:

        var set = NSSet(array: arrOfDict)
        

        【讨论】:

        • 我认为我们在 Swift 3.0 中不再需要 NS
        猜你喜欢
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 2017-12-29
        • 2010-12-21
        • 2012-02-03
        • 1970-01-01
        • 2017-09-04
        相关资源
        最近更新 更多