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?

7voto

ColinE Punkte 66577

Ich habe eine kleine Bibliothek von Kategoriemethoden erstellt, die Linq nach ObjectiveC Das macht solche Dinge einfacher. Die Verwendung des sortieren Methode mit einem Schlüsselselektor können Sie sortieren nach birthDate wie folgt:

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

7voto

roocell Punkte 2399

Ich habe die sortUsingFunction:: in einigen meiner Projekte:

int SortPlays(id a, id b, void* context)
{
    Play* p1 = a;
    Play* p2 = b;
    if (p1.score<p2.score) 
        return NSOrderedDescending;
    else if (p1.score>p2.score) 
        return NSOrderedAscending;
    return NSOrderedSame;
}

...
[validPlays sortUsingFunction:SortPlays context:nil];

5voto

Mohit Punkte 91

Sortierung NSMutableArray ist sehr einfach:

NSMutableArray *arrayToFilter =
     [[NSMutableArray arrayWithObjects:@"Photoshop",
                                       @"Flex",
                                       @"AIR",
                                       @"Flash",
                                       @"Acrobat", nil] autorelease];

NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];

for (NSString *products in arrayToFilter) {
    if (fliterText &&
        [products rangeOfString:fliterText
                        options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)

        [productsToRemove addObject:products];
}
[arrayToFilter removeObjectsInArray:productsToRemove];

5voto

Aamir Punkte 14851

Sortieren mit NSComparator

Wenn wir benutzerdefinierte Objekte sortieren wollen, müssen wir die NSComparator die für den Vergleich von benutzerdefinierten Objekten verwendet wird. Der Block gibt ein NSComparisonResult Wert, um die Reihenfolge der beiden Objekte zu bezeichnen. Um also ein ganzes Array zu sortieren NSComparator wird auf folgende Weise verwendet.

NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
    return [e1.firstname compare:e2.firstname];    
}];

Sortieren mit NSSortDescriptor
Nehmen wir als Beispiel an, dass wir ein Array haben, das Instanzen einer benutzerdefinierten Klasse Employee mit den Attributen firstname, lastname und age enthält. Das folgende Beispiel veranschaulicht, wie ein NSSortDescriptor erstellt wird, der verwendet werden kann, um den Inhalt des Arrays in aufsteigender Reihenfolge nach dem Altersschlüssel zu sortieren.

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

Sortieren mithilfe benutzerdefinierter Vergleiche
Namen sind Zeichenfolgen, und wenn Sie Zeichenfolgen sortieren, um sie dem Benutzer zu präsentieren, sollten Sie immer einen lokalisierten Vergleich verwenden. Oft möchte man auch einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen. Hier kommt ein Beispiel mit (localizedStandardCompare:), um das Array nach Vor- und Nachnamen zu sortieren.

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

Für Referenzen und ausführliche Diskussionen siehe: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials/objective-c/how-to-sort-nsarray-with-custom-objects/

4voto

James Rochabrun Punkte 3031

Die Protokolle und die funktionale Programmierung von Swift machen das sehr einfach. Sie müssen nur Ihre Klasse mit dem Comparable-Protokoll konform machen, die vom Protokoll geforderten Methoden implementieren und dann die sortierte(by: ) High-Order-Funktion verwenden, um ein sortiertes Array zu erstellen, ohne übrigens veränderbare Arrays verwenden zu müssen.

class Person: Comparable {
    var birthDate: NSDate?
    let name: String

    init(name: String) {
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
    }

    static func <(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
    }

    static func >(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
    }

}

let p1 = Person(name: "Sasha")
p1.birthDate = NSDate() 

let p2 = Person(name: "James")
p2.birthDate = NSDate()//he is older by miliseconds

if p1 == p2 {
    print("they are the same") //they are not
}

let persons = [p1, p2]

//sort the array based on who is older
let sortedPersons = persons.sorted(by: {$0 > $1})

//print sasha which is p1
print(persons.first?.name)
//print James which is the "older"
print(sortedPersons.first?.name)

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