webentwicklung-frage-antwort-db.com.de

So sortieren Sie ein Array von Datumsangaben in absteigender Reihenfolge

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

15
baste

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];
38
Anoop Vaidya

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;
19
vikingosegundo

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.

2
sarbuLopex

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

1
Daniel

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)
}
1
Kevin ABRIOUX

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];
0
jacai