Hilfe beim Sortieren eines NSArray über zwei Eigenschaften (mit NSSortDescriptor?)

8

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.

    
Jaanus 03.02.2010, 07:16
quelle

6 Antworten

17

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:

%Vor%

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).

    
Benedict Cohen 03.02.2010, 12:12
quelle
20

Meine Lösung ist:

%Vor%

Sie können es versuchen

    
Ha Duyen Hoa 24.12.2010 11:07
quelle
3

Ich würde eine neue Klasse mit dem Namen ItemGroup erstellen und dann einen zusätzlichen Ivar namens group zu Ihrer Elementklasse hinzufügen:

%Vor%

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 :

%Vor%

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:

%Vor%

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.

    
e.James 03.02.2010 07:24
quelle
1

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.

    
mjdth 03.02.2010 09:23
quelle
1

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

    
guPra 23.08.2011 19:10
quelle
0

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%     
james_womack 16.06.2011 18:29
quelle