2009-08-19 7 views
1

In meinem aktuellen iPhone-Projekt habe ich ein Wörterbuch erstellt, das die Unterwörterbücher nach dem ersten Buchstaben des "Name" -Schlüssels gruppiert. NSLog gibt Folgendes zurück. Ich möchte ein identisches Wörterbuch erstellen, das nur die "Name" -Schlüssel unter jedem Anfangsbuchstabenschlüssel zeigt. Was ist der beste Weg, um eine Kopie einiger Elemente in den Unterwörterbüchern zu erstellen? Die ObjectForKey-Methoden wählen nur die Elemente für den Anfangsbuchstaben aus (z. B. "B" oder "C"). Bitte lassen Sie mich wissen, wenn ich das nicht deutlich genug erkläre. Danke!Ein Wörterbuch mit mehreren Unterwörterbüchern kopieren und nur bestimmte Schlüssel aus den Unterwörterbüchern zurückgeben

sectionedDictionaryByFirstLetter:{ 
B =  (
      { 
     Name = "B...A Name Starting with B"; 
     Image = "ImageName1.png"; 
     Text = "Some Text"; 
    } 
); 
C =  (
      { 
     Name = "C...A Name Starting with C"; 
     Image = "ImageName2.png"; 
     Text = "Some Text"; 
    } 
); 
N =  (
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName3.png"; 
     Text = "Some Text"; 

    }, 
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName4.png"; 
     Text = "Some Text"; 

    }, 
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName5.png"; 
     Text = "Some Text"; 

    } 
    ); 
} 

Das Endergebnis ich suche ist:

sectionedDictionaryByFirstLetter:{ 
B =  (
      { 
     Name = "B...A Name Starting with B"; 
    } 
); 
C =  (
      { 
     Name = "C...A Name Starting with C"; 
    } 
); 
N =  (
      { 
     Name = "N...A Name Starting with N"; 
    }, 
      { 
     Name = "N...A Name Starting with N"; 
    }, 
      { 
     Name = "N...A Name Starting with N"; 
    } 
    ); 
} 

Antwort

1
NSMutableDictionary* newDict = [NSMutableDictionary dictionary]; 
for (NSString* key in sectionedDictionaryByFirstLetter) { 
    NSMutableArray* newList = [NSMutableArray array]; 
    [newDict setObject:newList forKey:key]; 
    for (NSDictionary* entry in [sectionedDictionaryByFirstLetter objectForKey:key]) { 
     NSString* name = [entry objectForKey:@"Name"]; 
     [newList addObject:[NSDictionray dictionaryWithObject:name forKey:@"Name"]]; 
    } 
} 
+0

Ich dachte immer, dass der Schlüssel-Enumerator eine Verschwendung ist. Es bedeutet in der Regel - iterieren durch die Schlüssel und nehmen Sie jeden Wert als eine "Suche" Operation später. –

+0

Danke für die Hilfe. Ich habe einen kleinen Tippfehler gefunden: objectWithKey sollte objectForKey sein. Wo werden die Arrays auch zu newDict hinzugefügt? Danke! – Jonah

+0

Hier ist, was ich getan habe, damit es funktioniert: NSString * name = [entry objectForKey: @ "Name"]; [newList addObject: [NSDictionary dictionaryWithObject: Name forKey: @ "Name"]]; NSString * afirstLetterString = [name substringToIndex: 1]; [newDict setObject: newList forKey: afirstLetterString]; – Jonah

2

Core Foundation hat eine große Funktion, CFDictionaryApplyFunction (Ich wünschte, sie seine Funktionalität zu NSDictionary zu portiert). NSDictionary und CFDictionary sind jedoch "gebührenfreie Brücken", das heißt, Sie können zwischen ihnen ohne Aufpreis wechseln.

Also wäre die Lösung, eine Applikatorfunktion zu erstellen, SaveName, die in CFDictionaryApplyFunction oben verwendet werden würde. Beispiel:

void SaveName(const void* key, const void* value, void* context) { 
    NSMutableDictionary* result = (NSMutableDictionary*) context; 
    NSDictionary* dataDict = (NSDictionary*) value; 
    NSString* letterKey = (NSString*) key; 
    [result setObject:[dataDict valueForKey:@"Name"] forKey:@letterKey]; 
} 

void main() { 

    NSDictionary* exampleDict = .. ; 
    NSMutableDictionary* resultDict = [NSMutableDictionary dictionary]; 
    CFDictionaryApplyFunction((CFDictionaryRef)exampleDict, SaveName, (void*)resultDict); 
    // now, the resultDict contains key-value pairs of letter-name! 
} 

Mein Code geht davon aus, dass es nur ein Objekt in dem „Wert“ Wörterbuch ist. Sie können SaveName ändern, um Ihre eigene Datenstruktur in Betracht zu ziehen, aber das ist im Grunde der Weg, dies zu tun.

+0

Wo sind die Arrays? –

+0

@Nikolai: Ich sagte, ich nehme an, es gibt nur ein Objekt, und das könnte geändert werden, um andere Datenstrukturen zu unterstützen .. Auch in Ihrer Antwort haben Sie vergessen, das Array später zu "NewDict" hinzufügen ... –

Verwandte Themen