16 Stimmen

NSArray von benutzerdefinierten Objekten nach ihren NSDate-Eigenschaften sortieren

Ich versuche, ein NSArray zu sortieren, das mit benutzerdefinierten Objekten befüllt wird. Jedes Objekt hat eine Eigenschaft startDateTime die vom Typ NSDate ist.

Der folgende Code ergibt ein Array, sortedEventArray , befüllt, aber nicht sortiert. Gehe ich das völlig falsch an, oder übersehe ich nur etwas Kleines?

NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" 
                                                                 ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors];

25voto

NSGod Punkte 22276

Sind Sie sicher, dass die startDateTime Instanzvariablen der Knotenereignisse nicht gleich null sind?

Wenn Sie noch keine haben, können Sie eine (benutzerdefinierte) -description Methode zu Ihren Knotenereignisobjekten hinzufügen, die in etwa so funktioniert:

- (NSString *)description {
   return [NSString stringWithFormat:@"%@ - %@",
                   [super description], startDateTime]];
}

Dann protokollieren Sie in Ihrem Sortiercode das Array davor und danach:

NSLog(@"nodeEventArray == %@", nodeEventArray);
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
                                     sortDescriptorWithKey:@"startDateTime" 
                                                 ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray
         sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"sortedEventArray == %@", sortedEventArray);

Wenn die startDateTime sind alle nil dann haben die Vorher- und Nachher-Arrays die gleiche Reihenfolge (da der Sortiervorgang dem Senden aller Arrays gleichkommt). -compare: Nachrichten an nil was im Grunde nichts bewirkt).

11voto

Jack Punkte 128223

Haben Sie versucht, durch Angabe der NSDate Komparator?

Beispiel:

NSSortDescriptor *dateDescriptor = [NSSortDescriptor
   sortDescriptorWithKey:@"startDateTime"
   ascending:YES
   selector:@selector(compare:)];

Dies sollte die Verwendung des richtigen Komparators der NSDate Klasse.

11voto

slottermoser Punkte 154

Ok, ich weiß, es ist ein bisschen spät, aber so würde ich es machen:

NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) {
    return [event1.startDateTime compare:event2.startDateTime];
}];

Ersetzen Sie natürlich Event durch die Klasse Ihres benutzerdefinierten Objekts. Der Vorteil dieses Ansatzes ist, dass Sie gegen künftige Umstrukturierungen geschützt sind. Wenn Sie die Eigenschaft startDateTime überarbeiten und in etwas anderes umbenennen würden, würde Xcode die Zeichenfolge, die Sie an den Sortierdeskriptor übergeben, wahrscheinlich nicht ändern. Plötzlich würde Ihre Sortierung Code brechen / nichts tun.

0voto

Martin Jacob Punkte 356

Sie können dies auf diese Weise erreichen,

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE];

[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

0voto

Darshit Shah Punkte 2288

Das können Sie auf diese Weise erreichen,

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField"  ascending:YES];

NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X