【发布时间】:2010-05-07 10:02:52
【问题描述】:
我有一个对象在一个大的 NSMutableDictionary 中,需要找出它有哪个键。所以我想从两列中查找那个“表”。不仅可以使用键,还可以使用对象(获取键)。这可能吗?
【问题讨论】:
标签: iphone nsmutabledictionary
我有一个对象在一个大的 NSMutableDictionary 中,需要找出它有哪个键。所以我想从两列中查找那个“表”。不仅可以使用键,还可以使用对象(获取键)。这可能吗?
【问题讨论】:
标签: iphone nsmutabledictionary
查看父类(NSDictionary)
- (NSArray *)allKeysForObject:(id)anObject
这将返回给定对象值的所有键的 NSArray。 但是它通过向 Dictionary 的每个对象发送 isEqual 消息来做到这一点,因此对于您的大型数据集,这可能不是最佳性能。
也许您需要保存某种形式的附加索引结构结构,以允许您在其中的某些关键值上定位对象,链接到键而无需直接进行对象比较
【讨论】:
要以更具体的方式回答您的问题,请使用以下命令获取特定对象的密钥:
NSString *knownObject = @"the object";
NSArray *temp = [dict allKeysForObject:knownObject];
NSString *key = [temp objectAtIndex:0];
//"key" is now equal to the key of the object you were looking for
【讨论】:
看看:
- (NSArray *)allKeysForObject:(id)anObject
【讨论】:
NSDictionary 的 block 方法绝对可以做到这一点
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate;
您需要返回满足某些条件(谓词)的对象。
像这样使用它:
NSSet *keys = [myDictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {
BOOL found = (objectForWhichIWantTheKey == obj);
if (found) *stop = YES;
return found;
}];
查看此答案了解更多详情
How do I specify the block object / predicate required by NSDictionary's keysOfEntriesPassingTest?
【讨论】: