【问题标题】:Bi-directional dictionary in objective-cObjective-C中的双向字典
【发布时间】:2019-10-31 05:56:29
【问题描述】:

假设我有一对一映射的键值对。 对于每个键,我都有唯一的价值。 那么我可以制作一个双向字典或类似的东西,它可以从 key 中给我价值,反之亦然?

附: - 我知道我可以使用[NSDictionary allKeysForObject: (nonnull id)],它返回具有该值的所有键的NSArray

我只是想知道是否有类似双向字典的东西那么它会有用。

如果有类似的情况,请也为 swift 提供解决方案。

谢谢。

【问题讨论】:

  • 你可以只维护两个字典,一个映射K->V,另一个映射V->K。如果存在“双向”字典(不存在),则它必须完成与两个字典相同的工作量。

标签: objective-c swift nsdictionary


【解决方案1】:

您可以扩展 Dictionary 将其 Value 限制为 Equatable 并提供您自己的 subscript 以返回第一个键值:

Xcode 11 • Swift 5.1

extension Dictionary where Value: Equatable {
    subscript(firstKeyFor value: Value) -> Key?  { first { $0.value == value }?.key }
    func allKeys(for value: Value) -> [Key] { compactMap { $0.value == value ? $0.key : nil } }
}

let dict = ["One": 1, "Two": 2, "Three": 3, "Um": 1, "Dois": 2, "Tres": 3]

if let key =  dict[firstKeyFor: 1] {
    print(key)   // "One"
}

let allKeys = dict.allKeys(for: 2)  // ["Dois", "Two"]

【讨论】:

    【解决方案2】:

    如果每个 Key 都有一个唯一的(!!!) 值,您可以使用

    将 Category 添加到 NSDictionary
    -(NSString*)keyForValue:(id)value{
        NSArray* allKeys = [self allKeysForObject:value];
        return [allKeys count] > 0 ? [allKeys objectAtIndex:0] : nil;
    }
    

    【讨论】:

    • 如果给定值没有键,则应用程序崩溃:)
    • 仍然崩溃。查看allKeysForObject 的文档以找出原因。
    • ...请在该方法前加上一些东西。
    猜你喜欢
    • 2012-06-13
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多