2013-02-03 80 views
4

我使用的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使用NSSet的性能比NSArrays更好。而且我不需要一個有序的對象序列。

回答

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]; 
+0

謝謝,這聽起來很合乎邏輯。如果Unique-Identifier-Key是NSString以外的對象(例如NSManagedObjectID)會怎樣?我是否必須將該密鑰轉換爲NSString,還是可以與其他類一起工作(我讀過用於密鑰的類必須採用NSCopying協議)?以及如何使用自定義鍵的性能? – FrankZp

+0

@FrankZp:這是正確的,鍵必須採用'NSCopying',但你已經在字典中使用它,所以不應該有任何問題。使用自定義鍵時的性能直接關係到'hash'方法的質量。對於大多數Cocoa類型,例如'NSString','hash'方法非常好。絕對最壞的情況是O(n)的複雜性(這與你現在的搜索方式在概念上沒有什麼不同),但你仍然可以從更簡單的代碼中獲益。 – dreamlax

0

當你使用NSSet這樣的效果時,我認爲它對性能沒有幫助。由於散列算法或某些排序算法,NSSet比NSArray具有更好的性能。如果您使用這樣的謂詞,我認爲NSSet必須搜索整個集合以找到您需要的項目。

我建議你創建一個新的類MyObject的,包含您的NSDictionary,並覆蓋hashisEqual

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

在哈希,你回到你的獨特價值的哈希,並且會提高你的表現。但是,如果您有需要搜索很少的對象,你可能只是你簡單的謂詞去

+0

MyObject會是什麼樣的類? NSSet的子類? – FrankZp