2011-01-12 10 views
2

Ich habe ein benutzerdefiniertes Objekt namens Person, dass unter anderem enthält ein NSString Feld descriptor genannt, die speichert, welche Art von Person, dass Person Objekt (wütend, traurig, wild, glücklich , mürrisch, usw.). Alle meine Person-Objekte sind in einer NSMutableArray, aber ich würde sie in einem NSMutableDictionary in einer solchen Art und Weise zu speichern, wie:verschiedene Schlüssel Point gleiches Objekt (e) in NSMutableDictionary

Key: A, Objekt: Ein NSMutableArray wo alle Person Objekte mit ‚A‘ descriptor Start

Key: B, Objekt: Ein NSMutableArray wo alle Person Objekte descriptor beginnend mit 'B'

Key haben: C, Objekt: Ein NSMutableArray wo alle Person Objekte descriptor beginnend mit 'C' etc haben ...

Ich habe versucht, dies in meinem Code unten zu tun, und am Kommentar // Punkt 1 scheinen die Tasten und Arrays übereinzustimmen, aber an // Punkt 2, wenn ich das komplette Wörterbuch alle ausdrucke Die Schlüssel ergeben die gleichen Werte!

Also wollte ich wissen, warum die NSMutableArray scheint ich habe nicht gespeichert wird, wie ich es in der NSMutableDictionary wollen?

- (void)buildDictionaryForIndexList { 
    NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init] autorelease]; 
    NSMutableArray *personsStartingWithLetter = [[NSMutableArray alloc] init]; 
    NSMutableArray *indexList = [[[NSMutableArray alloc] init] autorelease]; 
    NSInteger loopCounter = 1; 
    NSString *firstLetter = [[[NSString alloc] init] autorelease]; 
    for (Person *v in persons) { 
     firstLetter = [[v descriptor] substringWithRange:NSMakeRange(0, 1)]; 
     if ([indexList containsObject:firstLetter]) { 
      [personsStartingWithLetter addObject:v]; 
      if (loopCounter == [persons count]) { 
       [tempDict setObject:personsStartingWithLetter forKey:firstLetter]; 
      } 
     } else { 
      if (loopCounter > 1) { 
       //POINT 1 
       NSLog(@"%@",[indexList objectAtIndex:[indexList count]-1]); 
       for (Person *q in personsStartingWithLetter) { 
        NSLog(@"%@",[q descriptor]); 
       } 
       [tempDict setObject:personsStartingWithLetter forKey:[indexList objectAtIndex:([indexList count] - 1)]]; 
       [personsStartingWithLetter removeAllObjects]; 
      } 
      [indexList addObject:firstLetter]; 
      [personsStartingWithLetter addObject:v]; 
     } // else 
     loopCounter++; 
    } // for 
    //POINT 2 
    NSEnumerator *enumerator = [tempDict keyEnumerator]; 
    for (NSString *str in enumerator) { 
     NSLog(@"%@",str); 
     for (Person *c in [tempDict objectForKey:str]) { 
      NSLog(@"%@",[c descriptor]); 
     } 
    } 
    self.dictionary = tempDict; 
} // buildDictionaryForIndexList 

So zum Beispiel bei POINT 1 meine Ausgabe ist:

A

Verärgerte

Liebenswürdig

B

Belligerent

C

Coole

...

W

Wilde

aber bei POINT 2 meiner Ausgabe ist

T

Wilde

J

Wilde

A

Wilde

...

W

Wilde

+0

Erinnern Sie mich, warum in der Welt Sie tun '[[[[NSString Alloc] init] Autorelease]'? Gibt es dafür keine Helfer? Wie "Schnur"? –

+0

Warum verwenden Sie überhaupt "Autorelease" in dieser Methode? Die Lebensdauer dieser Objekte ist nur auf diese Methode beschränkt, daher können Sie ihnen auch einfach die '-release'-Nachricht am Ende der Methode senden. –

+0

@Jacob Relkin: Beschreibe es mit einem schlechten Speichermanagementstil. Aber, wenn ich all das geändert habe (und ich habe), stoße ich immer noch auf das gleiche Problem. – aqua

Antwort

2

ändern [tempDict setObject:personsStartingWithLetter forKey:[indexList objectAtIndex:([indexList count] - 1)]]; (kurz nach Punkt 1) bis [tempDict setObject:[[personsStartingWithLetter copy] autorelease] forKey:[indexList objectAtIndex:([indexList count] - 1)]];. Das Problem ist, dass NSDictionary den Schlüssel kopiert, aber den Wert behält. Wenn Sie daher dem Wörterbuch ein veränderbares Array hinzufügen und es dann ändern, ändert sich auch das Array im Wörterbuch. Sie müssen eine nicht veränderbare Kopie des Arrays erstellen, die in das Wörterbuch eingefügt werden soll.

+0

Großartig, das hat funktioniert! Vielen Dank. – aqua

0

Die ganze Methode ist ein wenig zu kompliziert.

- (void)buildDictionaryForIndexList 
{ 
    NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init] autorelease]; 
    for (Person *v in persons) 
    { 
     NSString* firstLetter = [[v descriptor] substringWithRange:NSMakeRange(0, 1)]; 
     NSMutableArray* personsStartingWithLetter = tempDict [firstLetter]; 
     if (personsStartingWithLetter == nil) 
     { 
      personsStartingWithLetter = [NSMutableArray array]; 
      tempDict [firstLetter] = personsStartingWithLetter; 
     } 
     [personsStartingWithLetter addObject:v]; 
    } // for 
    self.dictionary = tempDict; 
} 

Sie beginnen mit einem leeren Wörterbuch, das Arrays enthält. Sie überprüfen für jede Person, ob ein passendes Array vorhanden ist oder nicht, und falls nicht, erstellen Sie es. Also jetzt ist ein Array für die Person, also fügen Sie es dem Array hinzu. Das ist alles.

Verwandte Themen