Ich habe ein NSDictionary, das in einem Array analysiert wurde, in dem eines der Elemente date ist. Ich habe versucht, [startimeArray sortUsingSelector:@selector(compare:)];
(starttimeArray) zu verwenden, mein Datum, aber es wird nur aufsteigend angeordnet. Wie kann ich in absteigender Reihenfolge sortieren? Vielen Dank
Sortieren Sie das Array mit dem aufsteigenden ParameterNO:
NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[dateArray sortedArrayUsingDescriptors:descriptors];
Sie können einen Komparatorblock verwenden
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return [d1 compare:d2];
}];
um die Reihenfolge umzukehren, tauschen Sie einfach die Daten aus
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return [d2 compare:d1];
}];
oder - as compare:
gibt ein NSComparisonResult zurück, das tatsächlich als Ganzzahl geschrieben wird siehe unten - Einfach mit -1 multiplizieren
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(NSDate *d1, NSDate *d2) {
return -1* [d1 compare:d2];
}];
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
Ich würde die integrierte reverseObjectEnumerator
-Methode von NSArray
verwenden.
startimeArray = [startimeArray sortUsingSelector:@selector(compare:)];
startimeArray = [[startimeArray reverseObjectEnumerator] allObjects];
Dies ist nützlich, wenn das Array in aufsteigender und absteigender Reihenfolge sortiert werden muss, damit Sie problemlos zur vorherigen Sortierung zurückkehren können.
Swift 3.0
Für jeden, der Swift 3.0 verwendet, wird dies DateHelper Kopfschmerzen ersparen.
filteredLogs.sort(by: {
let firstElement = $0.timeStamp! as Date
let secondElement = $1.timeStamp! as Date
return firstElement.compare(.isEarlier(than: secondElement))
})
Der obige Code ist ein Ausschnitt aus einem meiner Projekte. Es verwendet die Helper-Klasse, um meine Protokolle mit den neuesten Daten auf der linken Seite des Arrays zu sortieren. Das $ -Zeichen ist ein Positionsparameter
Es gibt die Swift-Lösung für die geprüfte Lösung:
let sortedArray = randomArray.sortedArrayUsingComparator { (d1, d2) -> NSComparisonResult in
return (d1 as! NSDate).compare(d2 as! NSDate)
}
In der Klasse, in der die Array-Elemente initialisiert werden.
-(NSComparisonResult) compareArray: (id) element {
Return [ArrayElement compare: [element ArrayElement]];
}
-(NSComparisonResult) compareArrayReverse: (id) element {
Return [[element ArrayElement] compare: ArrayElement];
}
Dann in der Klasse, in der Ihr startimeArray initialisiert wird:
@synthesize ArrayName;
-(void) sort: (BOOL) sel {
if (sel) {
[ArrayName sortUsingSelector: @selector(compareArray:)];
} else {
[ArrayName sortUsingSelector: @selector(compareArrayReverse:)];
}
}
Dann in der Hauptsache ():
// Sort the array. sort = TRUE - ascending order, sort = FALSE - descending order.
[startimeArray sort: FALSE];