Ich bin ein bisschen wie ein NSSortDescriptor n00b. Ich denke jedoch, es ist das richtige Werkzeug für das, was ich tun muss:
Ich habe ein NSArray, das aus Objekten mit Schlüsseln besteht, sagen wir "Name" und "Zeit". Anstatt es zu verbalisieren, hier ein Beispiel:
%Vor%Die Werte sind also nach "Zeit" sortiert und nach "Name" gruppiert. A kommt zuerst, weil er den kleinsten Zeitwert hatte und alle Werte für A aufeinander folgen. Dann kommt C, er hat den zweitkleinsten Zeitwert aus all seinen Werten. Ich habe die Werte angegeben, die bestimmen, wie die Namen sortiert werden. Innerhalb jeder Namensgruppe erfolgt die Sortierung nach der Zeit.
Wie komme ich am effektivsten von der Eingabe zur Ausgabe von NSArray? (cpu-und memory-weise, nicht unbedingt code-weise.) Wie würde ich die NSSortDescriptors dafür konstruieren oder eine andere Methode verwenden? Ich möchte nicht meine eigenen rollen, außer es ist der effizienteste Weg.
Die sortedArrayUsingDescriptors:
NSArray
Methode macht das meiste von dem, was Sie brauchen:
Der erste Deskriptor gibt den Primärschlüsselpfad an, der beim Sortieren des Inhalts des Empfängers verwendet werden soll. Alle nachfolgenden Deskriptoren werden verwendet, um das Sortieren von Objekten mit doppelten Werten weiter zu verfeinern. Weitere Informationen finden Sie unter NSSortDescriptor.
Einige Filterungen mit NSPredicate
sind ebenfalls erforderlich:
Ich habe keine Ahnung, ob dies die effizienteste Methode ist, aber bis Sie Grund zu der Annahme haben, dass es Probleme verursacht, müssen Sie sich keine Sorgen über die Auswirkungen auf die Leistung machen. Es ist eine vorzeitige Optimierung. Ich hätte keine Bedenken hinsichtlich der Durchführung dieser Methode. Sie müssen dem Framework vertrauen, sonst werden Sie es am Ende aufgrund einer unbegründeten Paranoia neu schreiben (und damit den Rahmen des Frameworks untergraben).
Ich würde eine neue Klasse mit dem Namen ItemGroup
erstellen und dann einen zusätzlichen Ivar namens group
zu Ihrer Elementklasse hinzufügen:
Dann könnten Sie Folgendes tun:
%Vor% Dieser Code durchläuft das unsortierte Array, wobei die Mindestzeit für jede Gruppe und die Einstellung der Gruppe für jedes Element aufgezeichnet werden. Wenn Sie damit fertig sind, sortieren Sie einfach nach group.time
und time
:
Und das sollte den Trick tun!
UPDATE : Beachten Sie, dass Sie viel bessere Leistung erzielen könnten, wenn Sie die Gruppen direkt aus dem Gate heraus zuweisen könnten. Etwas wie das:
%Vor%Wenn Sie jetzt eine Liste von Gruppen irgendwo pflegen (sie könnten sogar irgendwo in ein Array gehen):
%Vor%Und anstatt die Namen Ihrer Datenelemente festzulegen, legen Sie ihre Gruppe fest:
%Vor%Dies würde die zum Setzen von Gruppenzeiten verwendete Schleife erheblich vereinfachen:
%Vor% Und wenn Sie wirklich schnell flammend sein wollten, könnten Sie sogar den Property-Setter für Ihre time
-Eigenschaft ändern, um die Gruppe im Handumdrehen zu setzen:
Beachten Sie, dass Sie sicherstellen müssen, dass group
festgelegt wurde, bevor Sie die Uhrzeit festlegen. Damit wäre diese Sortierschleife überhaupt nicht nötig. Die sortDescriptors wären genug.
Ich habe einen kleinen Code erstellt (ich habe nicht versucht, ihn auszuführen oder wirklich darüber zu gehen, damit es ein paar Fehler gibt, aber es hat die allgemeine Idee), das zu tun, wonach du suchst. Leistungsmäßig wird es wahrscheinlich nicht das Beste sein, wenn Sie anfangen, riesige Datenmengen zu verarbeiten. Ich bin mir sicher, dass es einen besseren Weg gibt, dies zu tun, aber ich hatte das Gefühl, es auf die einfachste Art und Weise als "temporäre Lösung" zu machen.
%Vor% Am Ende wirst du mit dem, was du suchst, in sortedarray
fertig.
Sie können NSSortDescriptor verwenden. Diese Deskriptoren sind sehr nützlich, da sie die Sortierung nach mehreren Schlüsseln und nach einzelnen Schlüsseln ermöglichen. Die Groß- / Kleinschreibung und Unempfindlichkeit ist ebenfalls leicht zu erreichen. Ich fand ein detailliertes Beispiel HIER
Wenn Sie eine kompliziertere Sortierung vornehmen müssen, die nur "aufsteigend" erledigt werden kann (sagen Sie NSString sortieren, als wären sie Floats), möchten Sie vielleicht so etwas tun:
%Vor%Tags und Links cocoa nsarray sorting nssortdescriptor