2013-06-24 17 views
7

Ich habe ein Array von Objekten, die aus zwei Eigenschaften bestehen: eine NSString und eine BOOL. Ich möchte dieses Array so sortieren, dass alle BOOL s, die YES sind, vor allen Bools angezeigt werden, die NO sind. Dann hätte ich gerne für die Liste der Objekte, die die BOOL YES alphabetisiert haben und ich möchte auch, dass die Objekte mit der NO alphabetisiert werden. Gibt es eine Art von Bibliothek, die dies in objektiven c erreichen kann? Wenn nicht, was ist der effizienteste Weg, dies zu tun?Sortieren Array basierend auf zwei Parametern

Antwort

20

können Sie NSSortDescriptor s verwenden, um die Sortierung zu tun:

// Set ascending:NO so that "YES" would appear ahead of "NO" 
NSSortDescriptor *boolDescr = [[NSSortDescriptor alloc] initWithKey:@"boolField" ascending:NO]; 
// String are alphabetized in ascending order 
NSSortDescriptor *strDescr = [[NSSortDescriptor alloc] initWithKey:@"strField" ascending:YES]; 
// Combine the two 
NSArray *sortDescriptors = @[boolDescr, strDescr]; 
// Sort your array 
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 

Sie können mehr lesen here mit Deskriptoren zu sortieren.

1

Nachschlagen von NSSortDescriptors. Erstellen Sie zwei, einen für die Zeichenfolge, einen für die Bool. Dann füge beide zu einem Array hinzu. Verwenden Sie dann die NSArray-Methode sortedArrayWiyhDescriptors.

3

Eine Alternative zu sortieren Deskriptoren ist ein NSComparator zu verwenden:

NSArray *myObjects = ... // your array of "Foo" objects 
NSArray *sortedArray = [myObjects sortedArrayUsingComparator:^(Foo *obj1, Foo *obj2) { 
    if ((obj1.boolProp && obj2.boolProp) || (!obj1.boolProp && !obj2.boolProp)) { 
     // Both bools are either YES or both are NO so sort by the string property 
     return [obj1.stringProp compare:obj2.stringProp]; 
    } else if (obj1.boolProp) { 
     // first is YES, second is NO 
     return NSOrderedAscending; 
    } else { 
     // second is YES, first is NO 
     return NSOrderedDescending; 
    } 
)]; 

Bitte beachten Sie, dass ich die letzten zwei nach hinten haben. Wenn dies die Nein-Werte vor den Ja-Werten sortiert, vertauschen Sie die letzten beiden Rückgabewerte.

Verwandte Themen