【问题标题】:Bidirectional Map in CocoaCocoa 中的双向映射
【发布时间】:2010-03-10 11:00:16
【问题描述】:

Cocoa 提供了 NSDictionary,本质上是一个关联数组。

有没有一种获得双向关联性的好方法?也就是说,如果 NSDictionary 有一个 keyForObject: 方法来反映 objectForKey: 的行为,那么一种方法是。

我真的不在乎 NSDictionary 是否不是获得这个的方法。我知道 NSDictionary 确实提供了keysOfEntriesPassingTest:,但它返回一个NSSet *,对于我想要的那种东西来说,它看起来不是很干净。

这是一个例子:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"c0",@"synckey",
    @"c1",@"wi_id",
    @"c2",@"wi_parent_id",
    @"c3",@"wi_type",
    @"c4",@"wi_rh_task",
    @"c5",@"decision_key",
    @"c6",@"wi_stat",
    @"c7",@"wi_prio",
    @"c8",@"wi_cd",
    @"c9",@"wi_ct",
    @"cb",@"wi_dh_stat",
    @"cc",@"wi_user",
    nil];

我想在 c0synckey 之间来回翻译,其他字段也是如此。

【问题讨论】:

    标签: objective-c cocoa data-structures dictionary


    【解决方案1】:

    我相信最接近你所追求的是allKeysForObject:。这将返回一个 NSArray,其中包含与字典中给定对象的所有出现对应的键。显然,如果对象只在字典中出现一次,则 NSArray 将只包含一个对象。

    所以你的例子:

    fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys:
        @"c0",@"synckey",
        @"c1",@"wi_id",
        @"c2",@"wi_parent_id",
        @"c3",@"wi_type",
        @"c4",@"wi_rh_task",
        @"c5",@"decision_key",
        @"c6",@"wi_stat",
        @"c7",@"wi_prio",
        @"c8",@"wi_cd",
        @"c9",@"wi_ct",
        @"cb",@"wi_dh_stat",
        @"cc",@"wi_user",
        nil];
    

    此附加代码将返回一个数组,其中包含 1 个字符串对象,评估结果为 @"c7":

    NSArray *keyArray = [fieldMap allKeysForObject:@"wi_prio"];
    

    [旁白:请注意,这仅适用于编译器的工作方式;它需要所有出现的 @"wi_prio" 并使它们成为同一个对象。相反,如果您可能从磁盘等加载字典,则此方法不适用于 NSStrings。相反,您可能应该使用 allKeys 然后遍历它们,与 [mystring isEqualToString:anotherString] 进行比较。]

    【讨论】:

      【解决方案2】:

      【讨论】:

      • CHDataStructures 似乎还有很多其他有用的东西。我将继续并包含它。
      猜你喜欢
      • 2010-11-14
      • 2010-11-07
      • 1970-01-01
      • 2016-04-19
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多