2012-06-17 35 views
4

我有一個主NSMutableDictionary包含其他人的集合NSMutableDictionary。iOS - 刪除存儲在主NSDictionary中的所有NSDictionaries上包含密鑰的所有條目

事情是這樣的:

NSMutableDictionary *subDict1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    obj1, @"name", 
    obj2, @"color", 
    nil]; 

NSMutableDictionary *subDict2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    obj3, @"name", 
    obj4, @"color", 
    obj5, @"address", 
    obj6, @"phone", 
    obj7, @"color", 
    obj8, @"parent", 
    nil]; 

NSMutableDictionary *subDict3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    obj0, @"name", 
    obj9, @"parent", 
    objA, @"site", 
    objB, @"surname", 
    objC, @"label", 
    nil]; 

這些子字典可以有不同數量的條目和按鍵可能會有所不同。有些人可能有同名的鑰匙。

它們存儲在主詞典是這樣的:

NSMutableDictionary *mainDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    subDict1, @"1", 
    subDict3, @"3", 
    subDict2, @"2", 
    nil]; 

我想在一杆,刪除具有特定鍵所有子字典中的所有條目。

我知道我可以遍歷字典和子字典,但我也知道字典有聰明的方法來做到這一點使用謂詞和其他的東西,但我沒有看到如何。我試圖找到,因爲這種方法會運行有點棘手,必須儘快做到這一點,我不確定是否正常迭代循環或任何將足夠快...

任何線索?謝謝。

回答

6

這裏是一個遞歸方法,不關心目標關鍵字有多少層次。 (還沒試過)...

- (void)removeKey:(NSString *)keyToRemove fromDictionary:(NSMutableDictionary *)dictionary { 

    NSArray *keys = [dictionary allKeys]; 

    if ([keys containsObject:keyToRemove]) { 
     [dictionary removeObjectForKey:keyToRemove]; 
    } else { 
     for (NSString *key in keys) { 
      id value = [dictionary valueForKey:key]; 
      if ([value isKindOfClass:[NSMutableDictionary self]]) { 
       [self removeKey:keyToRemove fromDictionary:(NSMutableDictionary *)value]; 
      } 
     } 
    } 
} 
+0

我不確定這會起作用。假設我這樣做[self removeKey:@「name」fromDictonary:mainDict];你的第一個喜歡你創建一個mainDict的鍵的數組,我想刪除的對象與這些鍵無關。我想要刪除的對象是存儲在mainDict中的子字典的條目... – SpaceDog

+0

我認爲它適用於這種情況:第一個條件將失敗,然後我們將在一個或多個sub字典。對包含密鑰的子字典進行遞歸調用將執行刪除操作。 – danh

+0

粘貼並放棄它。 – danh

-1

您只需遍歷所有子目錄並手動刪除相應的鍵值對。如果現在速度夠快,你不應該擔心。相反,創建一個工作實現並測試/測量它。如果速度太慢,那麼您可以對其進行分析並提出改進性能的方法。過早優化是一件壞事。

-2
NSArray* keys = [NSArray arrayWithObjects:@"name", @"address", nil]; 
[dics removeObjectsForKeys:keys]; //Or sub dics 
+0

我不明白。什麼是dics? mainDict?這將刪除所有子字典中具有「名稱」和「地址」鍵的所有對象嗎?請記住,每個子字典都在字典中。 – SpaceDog

+0

如果要刪除所有具有關鍵「名稱」的子字節中的所有對象,請執行: NSArray * keys = [NSArray arrayWithObjects:@「name」,nil]; (mainDict中的id鍵){ {[mainDict objectForKey:key] removeObjectsForKeys:keys]; } – webmastx

相關問題