2013-08-06 58 views
4

我爲了設置從JSON字符串enum類型,像這種映射NSString對象NSNumber對象在NSDictionary如何有效地得到NSDictionary中鍵值的反向映射?

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值轉換成字符串。我不想用反向映射存儲另一個字典,我使用的解決方案是通過映射字典進行線性搜索以查找值,然後返回鍵。

在實踐中,我的線性方法很好,性能和記憶都不是問題,但我從學術的角度好奇,如果有另一種更有效的方式我不知道或可能是一種不同的類型兩種方式保持映射的結構(確保所有值都是唯一的)?

+1

爲什麼你不想存儲另一個字典? – Wain

+8

如果映射是1:1(相互等價),那麼'[dict allKeysForObject:val] [0]'效果很好。 – 2013-08-06 22:38:32

+0

@ H2CO3謝謝,這就是我正在使用:) – jhabbott

回答

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)) ; 
} 
0

Dictionary對象通常與無論是BST(二叉搜索樹)實施或Hash Table。這兩種數據結構都可以有效地從密鑰中找到一個值。如果你閱讀這些算法的描述,你會明白爲什麼會出現這種情況。實現高效雙向查找的最好方法可能是實現一個數據結構,該數據結構由兩個字典支持,其鍵/值交換類型。時間複雜度的折衷可能是不可避免的。