You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }

代码解释

  1. Dictionary(grouping:by:):这里我们把原字典的所有键作为分组的元素,按myDict[$0](也就是原字典对应的值)来分组,得到一个[Int: [Int]]的字典,其中每个值对应的数组是所有原字典中对应这个值的键。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:55:52