Methode vergleichen
Entweder implementieren Sie eine Vergleichsmethode für Ihr Objekt:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor (besser)
oder normalerweise noch besser:
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];
Sie können einfach nach mehreren Schlüsseln sortieren, indem Sie dem Array mehrere hinzufügen. Die Verwendung von benutzerdefinierten Komparatormethoden ist ebenfalls möglich. Schauen Sie sich die Dokumentation an .
Blöcke (glänzend!)
Seit Mac OS X 10.6 und iOS 4 besteht auch die Möglichkeit, mit einem Block zu sortieren:
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Performance
Die -compare:
und blockbasierten Methoden sind im Allgemeinen viel schneller als die Verwendung, NSSortDescriptor
da letztere auf KVC beruht. Der Hauptvorteil der NSSortDescriptor
Methode besteht darin, dass sie eine Möglichkeit bietet, Ihre Sortierreihenfolge mithilfe von Daten anstelle von Code zu definieren. Dies macht es einfach, z. B. Dinge so einzurichten, dass Benutzer eine sortieren können, NSTableView
indem sie auf die Kopfzeile klicken.
NSMutableArray
bevorzuge ich die MethodensortUsingDescriptors
,sortUsingFunction
odersortUsingSelector
. Soweit das Array veränderbar ist, benötige ich normalerweise keine sortierte Kopie.Siehe die
NSMutableArray
MethodesortUsingFunction:context:
Sie müssen eine Vergleichsfunktion einrichten, die zwei Objekte (vom Typ
Person
, da Sie zweiPerson
Objekte vergleichen) und einen Kontextparameter verwendet .Die beiden Objekte sind nur Instanzen von
Person
. Das dritte Objekt ist eine Zeichenfolge, z. B. @ "BirthDate".Diese Funktion gibt Folgendes zurück
NSComparisonResult
: Sie gibtNSOrderedAscending
ifPersonA.birthDate
<zurückPersonB.birthDate
. Es wird zurückgegeben,NSOrderedDescending
wennPersonA.birthDate
>PersonB.birthDate
. Schließlich wirdNSOrderedSame
ifPersonA.birthDate
== zurückgegebenPersonB.birthDate
.Dies ist ein grober Pseudocode. Sie müssen genau festlegen, was es bedeutet, dass ein Datum "weniger", "mehr" oder "gleich" zu einem anderen Datum ist (z. B. Vergleich der Sekunden seit der Epoche usw.):
Wenn Sie etwas Kompakteres wünschen, können Sie ternäre Operatoren verwenden:
Inlining könnte dies vielleicht etwas beschleunigen, wenn Sie dies viel tun.
quelle
Ich habe dies in iOS 4 mit einem Block gemacht. Musste die Elemente meines Arrays von id in meinen Klassentyp umwandeln. In diesem Fall handelte es sich um eine Klasse namens Score mit einer Eigenschaft namens points.
Außerdem müssen Sie entscheiden, was zu tun ist, wenn die Elemente Ihres Arrays nicht vom richtigen Typ sind. In diesem Beispiel habe ich gerade zurückgegeben
NSOrderedSame
, aber in meinem Code habe ich eine Ausnahme.PS: Dies ist in absteigender Reihenfolge sortiert.
quelle
downcasting
erfordert keine Umwandlung vor der schwachen Variablen.return ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
Ab iOS 4 können Sie auch Blöcke zum Sortieren verwenden.
In diesem Beispiel gehe ich davon aus, dass die Objekte in Ihrem Array eine 'position'-Methode haben, die eine zurückgibt
NSInteger
.Hinweis: Das "sortierte" Array wird automatisch freigegeben.
quelle
Ich habe alles versucht, aber das hat bei mir funktioniert. In einer Klasse habe ich eine andere Klasse mit dem Namen "
crimeScene
" und möchte nach der Eigenschaft "crimeScene
" sortieren .Das funktioniert wie ein Zauber:
quelle
In Georg Schöllys zweiter Antwort fehlt ein Schritt , aber dann funktioniert es gut.
// fügte das 's' hinzu, weil beim Kopieren und Einfügen Zeit verschwendet wurde und es ohne das 's' in sortiertenArrayUsingDescriptors fehlschlug
quelle
Danke, es funktioniert gut ...
quelle
Ihre
Person
Objekte müssen eine Methode implementieren, beispielsweise eincompare:
anderesPerson
Objekt, undNSComparisonResult
entsprechend der Beziehung zwischen den beiden Objekten zurückkehren.Dann würde rufen Sie
sortedArrayUsingSelector:
mit@selector(compare:)
und es sollte getan werden.Es gibt andere Möglichkeiten, aber soweit ich weiß, gibt es kein Kakao-Äquiv der
Comparable
Schnittstelle. VerwendensortedArrayUsingSelector:
ist wahrscheinlich der schmerzloseste Weg, dies zu tun.quelle
iOS 4 Blöcke werden dich retten :)
http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html eine kurze Beschreibung
quelle
Für
NSMutableArray
verwenden Sie dassortUsingSelector
Verfahren. Es sortiert es an einem Ort, ohne eine neue Instanz zu erstellen.quelle
sortUsingComparator:
.Sie können die folgende generische Methode für Ihren Zweck verwenden. Es sollte Ihr Problem lösen.
quelle
Wenn Sie nur ein Array von
NSNumbers
sortieren, können Sie sie mit einem Aufruf sortieren:Dies funktioniert, weil die Objekte im Array (
NSNumber
Objekte) die Vergleichsmethode implementieren. Sie können dasselbe fürNSString
Objekte oder sogar für ein Array von benutzerdefinierten Datenobjekten tun , die eine Vergleichsmethode implementieren.Hier ist ein Beispielcode mit Komparatorblöcken. Es sortiert ein Array von Wörterbüchern, wobei jedes Wörterbuch eine Zahl in einem Schlüssel "sort_key" enthält.
Der obige Code geht durch die Arbeit, einen ganzzahligen Wert für jeden Sortierschlüssel zu erhalten und diese zu vergleichen, um zu veranschaulichen, wie dies zu tun ist. Da
NSNumber
Objekte eine Vergleichsmethode implementieren, könnte sie viel einfacher umgeschrieben werden:oder der Körper des Komparators könnte sogar auf 1 Zeile herunterdestilliert werden:
Ich bevorzuge eher einfache Anweisungen und viele temporäre Variablen, da der Code leichter zu lesen und leichter zu debuggen ist. Der Compiler optimiert die temporären Variablen ohnehin, sodass die All-in-One-Line-Version keinen Vorteil bietet.
quelle
Ich habe eine kleine Bibliothek von Kategoriemethoden namens Linq to ObjectiveC erstellt , die diese Art von Dingen einfacher macht. Mit der Sortiermethode mit einem Schlüsselwähler können Sie
birthDate
wie folgt sortieren :quelle
Ich habe gerade eine mehrstufige Sortierung basierend auf benutzerdefinierten Anforderungen durchgeführt.
// sortiere die Werte
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec
quelle
Ich habe sortUsingFunction :: in einigen meiner Projekte verwendet:
quelle
Sie verwenden NSSortDescriptor, um ein NSMutableArray mit benutzerdefinierten Objekten zu sortieren
quelle
quelle
Das Sortieren
NSMutableArray
ist sehr einfach:quelle
Sortieren mit NSComparator
Wenn wir benutzerdefinierte Objekte sortieren möchten, müssen wir diese bereitstellen
NSComparator
, um benutzerdefinierte Objekte zu vergleichen. Der Block gibt einenNSComparisonResult
Wert zurück, der die Reihenfolge der beiden Objekte angibt. Um das gesamte Array zu sortieren,NSComparator
wird es folgendermaßen verwendet.Sortieren mit NSSortDescriptor
Nehmen wir als Beispiel an, dass wir ein Array haben, das Instanzen einer benutzerdefinierten Klasse enthält. Der Mitarbeiter hat die Attribute Vorname, Nachname und Alter. Das folgende Beispiel zeigt, wie ein NSSortDescriptor erstellt wird, mit dem der Array-Inhalt in aufsteigender Reihenfolge nach dem Altersschlüssel sortiert werden kann.
Sortieren mit benutzerdefinierten Vergleichen
Namen sind Zeichenfolgen. Wenn Sie Zeichenfolgen sortieren, die dem Benutzer angezeigt werden sollen, sollten Sie immer einen lokalisierten Vergleich verwenden. Oft möchten Sie auch einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durchführen. Hier kommt ein Beispiel mit (localizedStandardCompare :), um das Array nach Nach- und Vornamen zu sortieren.
Referenz und ausführliche Diskussion finden Sie unter: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html
http://www.ios-blog.co.uk/tutorials / objectiv-c / wie-nsarray-mit-benutzerdefinierten-Objekten sortiert wird /
quelle
Die Protokolle und die funktionale Programmierung von Swift machen es sehr einfach, dass Sie Ihre Klasse nur an das Comparable-Protokoll anpassen, die vom Protokoll geforderten Methoden implementieren und dann die sortierte (nach :) Funktion hoher Ordnung verwenden müssen, um ein sortiertes Array zu erstellen, ohne es verwenden zu müssen veränderbare Arrays übrigens.
quelle
In meinem Fall verwende ich "sortedArrayUsingComparator", um ein Array zu sortieren. Schauen Sie sich den folgenden Code an.
Auch mein Objekt ist,
quelle
Sie müssen sortDescriptor erstellen und können dann das nsmutablearray mithilfe von sortDescriptor wie unten sortieren.
quelle
Verwenden Sie diese Option für verschachtelte Objekte.
lastRoute ist ein Objekt und dieses Objekt enthält das Objekt to, das Objekt object enthält die Zeichenfolgenwerte für den Nachnamen.
quelle
Array in Swift sortieren
Für
Swifty
Person unten ist eine sehr saubere Technik, um über dem Ziel für global zu erreichen. Lassen Sie uns eine benutzerdefinierte Beispielklasse haben, vonUser
der einige Attribute haben.Jetzt haben wir ein Array, das wir
createdDate
entweder aufsteigend oder / oder absteigend sortieren müssen . Fügen wir also eine Funktion für den Datumsvergleich hinzu.Jetzt haben wir ein
extension
vonArray
fürUser
. In einfachen Worten können Sie einige Methoden nur für diejenigen Arrays hinzufügen, die nurUser
Objekte enthalten.Verwendung für aufsteigende Reihenfolge
Verwendung für absteigende Reihenfolge
Verwendung bei gleicher Bestellung
quelle
Schnelle Version: 5.1
Wenn Sie eine benutzerdefinierte Struktur oder Klasse haben und diese willkürlich sortieren möchten, sollten Sie sort () mit einem abschließenden Abschluss aufrufen, der nach einem von Ihnen angegebenen Feld sortiert. Hier ist ein Beispiel mit einem Array von benutzerdefinierten Strukturen, die nach einer bestimmten Eigenschaft sortieren:
Wenn Sie ein sortiertes Array zurückgeben möchten, anstatt es an Ort und Stelle zu sortieren, verwenden Sie sorted () wie folgt:
quelle
quelle
quelle