Cocoa中的双向映射

10

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];

我想在和之间进行翻译,同样也是对其他字段。

2个回答

10

你需要的最接近的方法是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"都变成相同的对象。如果您从磁盘等位置加载了字典,那么这种方法就行不通了。相反,您应该使用allKeys,然后遍历它们,与[mystring isEqualToString:anotherString]进行比较。]


8

CHDataStructures似乎还有很多其他有用的东西。我打算继续包含它。 - ArjunShankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接