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

Objective c 如何有效地获取NSDictionary中键值的反向映射?,objective-c,nsdictionary,Objective C,Nsdictionary,我正在将NSString对象映射到NSDictionary中的NSNumber对象,以便从JSON字符串设置enum类型,如下所示: typedef enum { XXEnumTypeA, XXEnumTypeB, XXEnumTypeC, } XXEnumType; ... @property (nonatomic, assign) XXEnumType enumType; ... self.mapNSStringToEnumType = @{ @"en

我正在将
NSString
对象映射到
NSDictionary
中的
NSNumber
对象,以便从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
值转换为字符串。我不想存储另一个带有反向映射的字典,我使用的解决方案是通过映射字典进行线性搜索,找到值,然后返回键


在实践中,我的线性方法很好,性能和内存都不是问题,但从学术角度来看,我很好奇是否有另一种更有效的方法我不知道,或者可能有另一种不同类型的结构来保持双向映射(确保所有值都是唯一的)?

您可能想尝试以下内容:

#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:1(相互等效),那么
[dict allKeysForObject:val][0]
工作得很好。@H2CO3谢谢,这就是我正在使用的:)请看@Wain,因为实际上映射字典是由一个子类提供的,我并不想生成反向映射并将其存储在相关对象中(因为它是更复杂的代码,我喜欢保持简单),线性搜索解决方案非常好。这个问题真的是学术性的——我想我不需要深入了解背景的任何细节,我可以说“在内存不足的环境中提供一本大词典,这样线性搜索速度很慢,存储反向地图也不切实际……等等”: