我使用NSSet有以下星座:
NSSet {
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueABC
"Key3": ValueDEF
}
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueFGH
"Key3": ValueJKL
}
NSDictionary {
"Unique-Identifier-Key": Unique Value
"Key2": ValueRST
"Key3": ValueXYZ
}
}
我正在寻找一种通过其唯一值从NSSet中获取一个字典的方法。 NSSet中有很多NSDictionaries,因此我正在寻找性能最佳的方式。
如何以下列方式使用(NSSet *)objectsPassingTest:(BOOL (^)(id obj, BOOL *stop))predicate
?
NSString *idSearched = ...;
NSSet *results = [MySet objectsPassingTest:^(id obj,BOOL *stop){
if ([obj valueForKey:@"Unique-Identifier-Key"] == idSearched) return YES;
else return NO;
}];
这是性能最佳的解决方案吗?我使用NSSet,因为我读到NSSets比NSArrays有更好的性能来查找对象。而且我不需要有序的对象序列。
答案 0 :(得分:5)
我认为你想要的实际布局是:
NSDictionary {
Unique Value: NSDictionary {
"Key2": ValueABC
"Key3": ValueDEF
}
Unique Value: NSDictionary {
"Key2": ValueFGH
"Key3": ValueJKL
}
Unique Value: NSDictionary {
"Key2": ValueRST
"Key3": ValueXYZ
}
}
基本上,不是将唯一键/值对存储在字典中,而是使用新字典,其中唯一值是键到其他数据。如果您的唯一值是NSString
,那么您会发现您可能接近O(1)时间复杂度。
您可以使用以下代码将您的设置转换为上述布局:
NSMutableDictionary *searchable = [NSMutableDictionary dictionary];
for (NSDictionary *dict in MySet)
[searchable setObject:dict forKey:[dict objectForKey:@"Unique-Identifier-Key"]];
(尽管将数据直接加载到上述结构中而不是从集合中转换它会更好)。然后,只要你想找到一个词典:
NSDictionary *dict = [searchable objectForKey:idSearched];
答案 1 :(得分:0)
当您使用NSSet
时,我认为它不会帮助您提高性能。由于哈希算法或某些排序算法,NSSet
的性能优于NSArray。如果您使用这样的谓词,我认为NSSet
必须搜索整个集合以找到您需要的项目。
我建议您创建一个包含NSDictionary
的新类MyObject,并覆盖hash
和isEqual
- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;
在哈希中,您将返回唯一值哈希,这将提高您的性能。但是如果您需要搜索的对象非常少,那么您可以使用简单的谓词