2010-12-04 4 views
11

Sortierung Ich habe eine NSArray von NSDate Objekte und ich möchte sie sortieren, so dass heute bei 0 ist, gestern um 1 usw.eine NSArray von NSDates

Ist es aufsteigend oder absteigend, und verwende ich eine Funktion, Selektor oder was?

Antwort

37

Es gibt verschiedene Sortiermethoden für NSArray, da es verschiedene Möglichkeiten gibt, Dinge zu sortieren. NSSortDescriptors sind eine allgemeine Methode, die Ihnen viele Optionen bietet, was die zu verwendenden Schlüssel für die Sortierung, die Selektoren, die Sie für diese Schlüssel verwenden möchten, und die allgemeine Reihenfolge usw. usw. Oder Sie können stattdessen Funktionen oder Komparatorblöcke verwenden Ihr Fall erfordert das, oder wenn das für Ihren speziellen Fall bequemer ist.

Um Ihre erste Frage zu beantworten, wenn Sie wollen, dass heute zuerst, gefolgt von gestern dann, ja, das ist natürlich absteigend.

Um einige Daten in absteigender Reihenfolge sortieren Sie dies nur tun können: (ein NSArray voller NSDates namens 'dateArray' vorausgesetzt):

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]; 
NSArray *descriptors = [NSArray arrayWithObject: descriptor]; 
[descriptor release]; 

NSArray *reverseOrder = [dateArray sortedArrayUsingDescriptors:descriptors]; 

Oder, wenn Sie für iOS bauen 4+ oder Snow Leopard + Sie können dies tun:

NSArray *reverseOrderUsingComparator = [dateArray sortedArrayUsingComparator: 
             ^(id obj1, id obj2) { 
              return [obj2 compare:obj1]; // note reversed comparison here 
             }]; 
-1

Versuchen Sie, diese Magie:

Sortieren Reihe von Terminen aufsteigend.

d. H. Daten werden später und später oder, um es anders auszudrücken, Daten, die in die Zukunft gehen.

NSArray ascendingDates = [dates sortedArrayUsingSelector:@selector(compare:)]; 

Sortieren Reihe von Terminen in absteigender Reihenfolge.

(was die Frage gestellt)

heißen Daten immer früher bekommen, Daten in die Vergangenheit zu gehen oder um es anders zu sagen: heute ist bei Index 0, gestern bei Index 1.

NSArray* descendingDates = [[[dates sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];