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

Swift中根据值为字符串数组的字典查找对应键的高效实现方案

场景1:查询次数远高于员工/部门数据更新次数

这种情况下你提到的提前构建员工→部门的反向映射字典是最优方案,单次查询时间复杂度为O(1),性能开销最低。
你可以通过懒加载或者属性观察器来减少维护成本,避免手动同步两个字典:

// 反向映射用懒加载,第一次查询时才生成,避免无用内存占用
lazy var employeeToDepartment: [String: String] = {
    var mapping = [String: String]()
    for (dept, employees) in acmeInc {
        employees.forEach { mapping[$0] = dept }
    }
    return mapping
}()

// 如果原字典会频繁更新,可以加didSet自动同步反向映射
var acmeInc: [String: [String]] = [
    "marketing"  : ["john", "amanda", "peter"],
    "operations" : ["anna", "teresa", "jack", "tom", "nigel", "katy"],
    "sales"      : ["bill", "jill"]
] {
    didSet {
        var newMapping = [String: String]()
        for (dept, employees) in acmeInc {
            employees.forEach { newMapping[$0] = dept }
        }
        employeeToDepartment = newMapping
    }
}

对应的函数实现:

func printDepartmentOfEmployee(employee: String) {
    guard let dept = employeeToDepartment[employee] else {
        print("\(employee) 不属于任何部门")
        return
    }
    print("\(employee) works in department \(dept)")
}

场景2:数据更新频率极高、查询次数极少

如果你的业务场景里部门人员变动非常频繁,查询需求很少,那不需要额外维护反向映射,每次查询直接遍历原字典即可,数据量小的情况下感知不到性能差异:

func printDepartmentOfEmployee(employee: String) {
    guard let dept = acmeInc.first(where: { $0.value.contains(employee) })?.key else {
        print("\(employee) 不属于任何部门")
        return
    }
    print("\(employee) works in department \(dept)")
}

关于是否要替换现有数据结构

如果你的业务只有「存储部门对应员工列表」、「查询员工所属部门」两个需求,现有的Dictionary结构完全够用,不需要替换为更复杂的结构。如果后续有更多人员、部门的关联查询需求,再考虑自定义数据模型即可。

内容的提问来源于stack exchange,提问作者atrdeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:39:01