Swift技术问题:去除重复索引,反转键值构建含数组值的新字典
解决Swift字典按值分组并过滤单元素组的问题
嘿,这个需求很常见!要把原来的[Int:Int]字典转换成以原字典的值为键、对应所有原键组成的数组为值的新字典,还只保留那些有多个原键对应同一个值的条目,对吧?而且你提到原始字典有上千条数据,那得用高效的方法才行。
直接用Swift标准库的高效方案
Swift的标准库提供了Dictionary(grouping:by:)方法,专门用来做分组操作,效率非常高,处理上千条数据完全不在话下。结合compactMapValues还能轻松过滤掉只有单个元素的组,完美匹配你的需求:
// 你的原始字典 var myDict: [Int: Int] = [12:2345, 14:2345, 99:1111, 67:1111, 77:7657, 132:3345, 199:6778] // 一步完成分组+过滤 let newDict: [Int: [Int]] = Dictionary(grouping: myDict.keys, by: { myDict[$0]! }) .compactMapValues { $0.count > 1 ? $0 : nil }
代码解释
Dictionary(grouping:by:):这里我们把原字典的所有键作为分组的元素,按myDict[$0](也就是原字典对应的值)来分组,得到一个[Int: [Int]]的字典,其中每个值对应的数组是所有原字典中对应这个值的键。compactMapValues:这个方法会遍历字典的每个值,我们只保留那些数组长度大于1的条目,过滤掉只有单个键的组,正好符合你期望的输出结果。
输出结果
运行这段代码后,newDict的值就是你想要的:
[2345: [12, 14], 1111: [99, 67]]
扩展:如果想保留所有条目(包括单元素组)
要是你之后需要保留所有值对应的键数组,不管有没有重复,只需要去掉compactMapValues那部分就行:
let fullDict = Dictionary(grouping: myDict.keys, by: { myDict[$0]! })
这样得到的字典会包含所有原字典的值作为键,比如7657: [77]、3345: [132]这些条目也会保留。
内容的提问来源于stack exchange,提问作者ooenomel2003
相关产品推荐
相关产品推荐

