NSSet with dictionaries:通过Key的值获取对象

时间:2013-02-03 22:31:22

标签: objective-c nsarray nsdictionary enumeration nsset

我使用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有更好的性能来查找对象。而且我不需要有序的对象序列。

2 个答案:

答案 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,并覆盖hashisEqual

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

在哈希中,您将返回唯一值哈希,这将提高您的性能。但是如果您需要搜索的对象非常少,那么您可以使用简单的谓词