Cocoa中的双向映射

时间:2010-03-10 11:00:16

标签: objective-c cocoa data-structures dictionary

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

我想在 c0 synckey 之间进行翻译,然后返回其他字段。

2 个答案:

答案 0 :(得分: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”的所有出现并使它们成为同一个对象。如果你可能从磁盘上加载了字典等,这种方法对NSStrings不起作用。相反,你应该使用allKeys,然后与[mystring isEqualToString:anotherString]进行比较,然后迭代它们。]

答案 1 :(得分:8)