1324 Stimmen

Wie kann ich ein NSMutableArray mit benutzerdefinierten Objekten darin sortieren?

Was ich tun möchte, scheint ziemlich einfach zu sein, aber ich kann keine Antworten im Internet finden. Ich habe eine NSMutableArray von Objekten, und sagen wir, es sind 'Person'-Objekte. Ich möchte die NSMutableArray durch Person.birthDate, das eine NSDate .

Ich glaube, es hat etwas mit dieser Methode zu tun:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

In Java würde ich dafür sorgen, dass mein Objekt Comparable implementiert, oder Collections.sort mit einem benutzerdefinierten Inline-Vergleicher verwenden... wie um alles in der Welt machen Sie das in Objective-C?

28voto

Manuel Spuhler Punkte 870

Es gibt einen fehlenden Schritt in Die zweite Antwort von Georg Schölly , aber dann funktioniert es gut.

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

// Das "s" wurde hinzugefügt, weil ich beim Kopieren und Einfügen Zeit verschwendet habe und es ohne das "s" in sortedArrayUsingDescriptors nicht funktioniert hat.

21voto

Hardik Darji Punkte 209
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

Danke, es funktioniert gut...

19voto

freespace Punkte 16029

Ihr Person Objekte müssen eine Methode implementieren, zum Beispiel compare: was eine weitere Person Objekt, und geben Sie NSComparisonResult je nach der Beziehung zwischen den 2 Objekten.

Dann würden Sie anrufen sortedArrayUsingSelector: con @selector(compare:) und es sollte getan werden.

Es gibt andere Möglichkeiten, aber soweit ich weiß, gibt es kein Cocoa-Äquivalent des Comparable Schnittstelle. Verwendung von sortedArrayUsingSelector: ist wahrscheinlich die schmerzloseste Art, dies zu tun.

12voto

IOS 4 Blöcke werden dich retten :)

featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
{
    DMSeatFeature *first = ( DMSeatFeature* ) a;
    DMSeatFeature *second = ( DMSeatFeature* ) b;

    if ( first.quality == second.quality )
        return NSOrderedSame;
    else
    {
        if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
        {
            if ( first.quality < second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        }
        else // eSeatQualityRed || eSeatQualityYellow
        {
            if ( first.quality > second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        } 
    }
}] retain];

http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html eine kleine Beschreibung

10voto

DenTheMan Punkte 1267

Für NSMutableArray verwenden Sie die sortUsingSelector Methode. Sie sortiert es an Ort und Stelle, ohne eine neue Instanz zu erzeugen.

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