如何有效地获取NSDictionary中键值的反向映射?

时间:2013-08-06 22:25:16

标签: objective-c nsdictionary

我将NSString个对象映射到NSNumber中的NSDictionary个对象,以便从JSON字符串中设置enum类型,如下所示:

typedef enum
{
    XXEnumTypeA,
    XXEnumTypeB,
    XXEnumTypeC,
} XXEnumType;

...

@property (nonatomic, assign) XXEnumType enumType;

...

self.mapNSStringToEnumType =
@{
    @"enumTypeA" : @(XXEnumTypeA),
    @"enumTypeB" : @(XXEnumTypeB),
    @"enumTypeC" : @(XXEnumTypeC),
};

...

self.enumType = [self.mapNSStringToEnumType[stringFromJSON] integerValue];

现在我想转而将enum值转换为字符串。我不想用反向映射存储另一个字典,我使用的解决方案是通过映射字典进行线性搜索以找到值,然后返回密钥。

在实践中,我的线性方法很好,性能和记忆都不是问题,但是从学术观点我很好奇,如果还有另一种我不了解的更有效的方法,或者可能是另一种类型的两种方式都保持映射的结构(确保所有值都是唯一的)?

2 个答案:

答案 0 :(得分:1)

你可能想尝试这些方面:

#define S(x)    #x
#define TOS(x)  @S(x)

然后:

typedef enum {
    MyEnum_01
,   MyEnum_02
} MyEnum ;

- (void) test {
    NSLog(@"%@", TOS(MyEnum_01)) ;
    NSLog(@"%@", TOS(MyEnum_02)) ;
}

答案 1 :(得分:0)

字典对象通常使用BST(二进制搜索树)或Hash Table实现。这两种数据结构都旨在有效地从密钥中查找值。如果你阅读这些算法的描述,你会明白为什么会这样。实现高效双向查找的最佳方法可能是实现一个由两个字典支持的数据结构,其中键/键值被交换。时间空间复杂性的折衷可能是不可避免的。