4

我使用 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 在查找对象方面比 NSArray 具有更好的性能时,我使用了 NSSet。而且我不需要对象的有序序列。

4

2 回答 2

5

我认为您想要的实际布局是:

NSDictionary {
    Unique Value: NSDictionary {
        "Key2": ValueABC
        "Key3": ValueDEF
    }

    Unique Value: NSDictionary {
        "Key2": ValueFGH
        "Key3": ValueJKL
    }

    Unique Value: NSDictionary {
        "Key2": ValueRST
        "Key3": ValueXYZ
    }
}

基本上,与其将唯一键/值对存储在字典中,不如使用一个新字典,其中唯一值是其他数据的键。如果您的唯一值是 anNSString那么您会发现您可能会接近 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];
于 2013-02-03T23:37:14.137 回答
0

我认为当你NSSet这样使用它时它不会帮助你提高性能。NSSet由于散列算法或某些排序算法,它比 NSArray 具有更好的性能。如果您使用这样的谓词,我认为NSSet必须搜索整个集合才能找到您需要的项目。

我建议您创建一个新类 MyObject,其中包含您的NSDictionary, 并覆盖hashandisEqual

- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;

在散列中,您返回唯一值散列,这将提高您的性能。但是,如果您需要搜索的对象很少,您可以只使用简单的谓词

于 2013-02-03T23:06:33.907 回答