Swift:删除重复的索引并创建一个反向索引和值的新字典

时间:2018-04-12 05:32:35

标签: arrays swift xcode dictionary

我有一个带有两个Int的A:B的字典,我想创建一个新的字典,其中包括B作为索引(没有重复)和A作为值(仅用于重复的B):

var myDict : [Int:Int] = [12:2345, 14:2345, 99:1111, 67:1111, 77:7657, 132:3345, 199:6778]

期望的输出:

var newDict: [Int:[Int]] = [2345: [ 12 , 14 ] , 1111: [ 99 , 67] ]

注意:原始字典包含超过一千个条目。

3 个答案:

答案 0 :(得分:1)

通过枚举它来遍历第一个字典,这样就可以将值切换到新字典

var newDict: [Int:[Int]] = [:]
let myDict : [Int:Int] = [12:2345, 14:2345, 99:1111, 67:1111, 77:7657, 132:3345, 199:6778]



     for values in myDict.enumerated() {
            var newValue = newDict[values.element.value] ?? []
            newValue.append(values.element.key)
            newDict[values.element.value] = newValue
        }

     newDict = newDict.filter { (key, value) -> Bool in
             value.count > 1
        }

答案 1 :(得分:1)

以下是swift的力量:

let newDict = Dictionary(grouping: myDict, by: {$0.value}).filter({$0.value.count > 1}).mapValues({$0.map({$0.key})})
print(newDict)
  

输出: [1111:[67,99],2345:[12,14]]

答案 2 :(得分:0)

请使用此代码:

var myDict: [Int:Int] = [12:2345, 14:2345, 99:1111, 67:1111, 77:7657, 132:3345, 199:6778]
let values = myDict.values
let tempValueSet = Set<Int>(values)
let uniqueValues = Array(tempValueSet)
var result = [Int: [Int]]()

for item in uniqueValues {
    result[item] = myDict.allKeys(forValue: item)
}
print(result)

这是Dictionary扩展名:

extension Dictionary where Value: Equatable {
    func allKeys(forValue val: Value) -> [Key] {
        return self.filter { $1 == val }.map { $0.0 }
    }
}

期望的输出:

[6778: [199], 1111: [99, 67], 7657: [77], 3345: [132], 2345: [12, 14]]

有关此扩展程序的更多参考:https://stackoverflow.com/a/27218964/2284065

如果您不想使用扩展程序,那么您也可以使用此代码:

var myDict: [Int:Int] = [12:2345, 14:2345, 99:1111, 67:1111, 77:7657, 132:3345, 199:6778]
let values = myDict.values
let tempValueSet = Set<Int>(values)
let uniqueValues = Array(tempValueSet)
var result = [Int: [Int]]()

for item in uniqueValues {
    result[item] = (myDict as NSDictionary).allKeys(for: item) as! [Int]
}
print(result)