2010-08-02 9 views

Antwort

8

Wenn Sie unbedingt einen Wörterbuchcontainer verwenden müssen, müssen Sie einen Schlüssel verwenden, der in der Reihenfolge sortierbar ist, in der Sie Schlüssel/Wert-Paare hinzufügen. Wenn Sie also Ihr Wörterbuch erstellen, verwenden Sie einen Schlüssel, der eine automatisch inkrementierende Ganzzahl oder eine ähnliche Zahl ist. Sie können dann nach den (ganzzahligen) Schlüsseln sortieren und die Werte abrufen, die diesen Schlüsseln zugeordnet sind.

Wenn Sie all dies tun, können Sie auch einfach eine NSMutableArray verwenden und Werte direkt zum Array hinzufügen! Es wird viel schneller und benötigt weniger Code. Sie rufen nur Objekte in der Reihenfolge:

for (id obj in myArray) { /* do stuff with obj... */ } 
7

NSMutableDictionary kann das nicht tun. Sehen Sie sich z.B. Matt Gallaghers OrderedDictionary.

+0

Aber können Sie mir sagen, wie man diese Klasse benutzt? – iWatch

2

ich eine schnelle Methode habe einen Quell-Array (von Objekten, die alle in der falschen Reihenfolge sind) zu nehmen und ein Referenzfeld (das hat Objekte in einem gewünschten (und völlig willkürlich) Reihenfolge) und gibt ein Array zurück, in dem die Elemente des Quell-Arrays neu organisiert wurden, damit sie mit dem Referenz-Array übereinstimmen.

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray 
{ 
    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [referenceArray count]; i++) 
    { 
     if ([sourceArray containsObject:[referenceArray objectAtIndex:i]]) 
     { 
      [returnArray addObject:[arrReference objectAtIndex:i]]; 
     } 
    } 
    return [returnArray copy]; 
} 

Beachten Sie, dass dies sehr zerbrechlich ist. Es verwendet die containsObject: Methode, die schließlich NSObject's isEqual: aufrufen wird. Grundsätzlich sollte es gut für Arrays von NSString s, NSNumber s und vielleicht NSDate s funktionieren (habe das noch nicht probiert), aber darüber hinaus, YMMV. Ich stelle mir vor, wenn Sie versuchen, Arrays von UITableViewCell s oder ein anderes wirklich komplexes Objekt zu übergeben, würde es sich selbst total abstürzen und entweder Total Crash oder Total-Müll zurückgeben. Wenn Sie etwas tun möchten, übergeben Sie beispielsweise ein Array von NSDate s als Referenz-Array und ein Array von NSString als Quell-Array. Wenn das Quell-Array Elemente enthält, die nicht im Referenz-Array enthalten sind, werden sie einfach verworfen. Man könnte einige dieser Probleme lösen, indem man ein wenig zusätzlichen Code hinzufügt.

All das gesagt, wenn Sie versuchen, etwas Einfaches zu tun, sollte es gut funktionieren. In Ihrem Fall könnten Sie das Referenz-Array aufbauen, während Sie Ihre setValue:forKey: Schleife durchlaufen.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (//whatever you are looping through here) 
{ 

    [yourDictionary setValue://whatever forKey:key]; 
    [referenceArray addObject:key]; 

} 

Dann, wenn Sie eine Schleife über Ihre Artikel in der gewünschten Reihenfolge kamen sie in, die Sie gerade

for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray]) 
+0

Dies ist eine eigentlich ziemlich anständige Lösung. Danke – darwindeeds

+0

Unnötig, das erste Stück Code in Ihrer Antwort oben zu verwenden. Sobald Sie die Schlüssel im Referenz-Array gesetzt haben wie oben, wo Sie den Schlüssel im referenceArray gesetzt haben, müssen Sie sich nicht mehr mit der Array-Methode "source-reference" (erste Methode oben) anlegen, weil ein Array Werte in "ORDER" enthält ". Sie können einfach über das referenceArray iterieren und erhalten die Objekte von "yourDictionary" in der Reihenfolge wie "Ganesh" in dem Post unten hingewiesen: für (NSString * Schlüssel in ReferenzArray) { // Get-Objekt aus dem Wörterbuch ID-Objekt = [yourDictionary objectForKey: key]; } – programmer

0

Eigentlich Sie ein Referenzfeld, um Art und Weise haben, dann, warum Sie einen hinzufügen haben mehr Array.So denke ich, dieser Ansatz ist nicht gut. Bitte bedenken Sie meine Meinung.

0

Obwohl @GenralMike ‚s Antwort eine Brise funktioniert, könnte es durch Weglassen des unnötigen Code optimiert werden, wie folgt:

1) einem Array Halt Bezug auf den Dictionary-Schlüssel in der Reihenfolge, wie sie hinzugefügt werden, zu halten.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (id object in someArray) { 

    [yourDictionary setObject:object forKey:someKey]; 
    [referenceArray addObject:someKey]; // add key to reference array 

} 

2) hält nun die „referenceArray“ alle Schlüssel, um, also können Sie in der gleichen Reihenfolge Objekte aus dem Wörterbuch abgerufen werden, wie sie ursprünglich dem Wörterbuch hinzugefügt wurden.

for (NSString *key in referenceArray){ 
    //get object from dictionary in order 
    id object = [yourDictionary objectForKey:key]; 
}