Was ist der effizienteste Weg, um eine NSSet zu sortieren?
-
21-08-2019 - |
Frage
Was ist der effizienteste Weg, um Objekte in einem NSSet
/ NSMutableSet
zu sortieren basierend auf einer Eigenschaft der Objekte in der Menge? Im Augenblick ist die Art, wie ich es tue, ist, indem sie durch jedes Objekt iterieren, fügen Sie sie zu einem NSMutableArray
und sortieren das Array mit NSSortDescriptor
.
Lösung
versuchen Sie es mit
[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];
Bearbeiten : Für iOS ≥ 4,0 und Mac OS X ≥ 10.6 können Sie direkt verwenden
[mySet sortedArrayUsingDescriptors:descriptors];
Andere Tipps
Die „effizienteste Weg,“ eine Reihe von Objekten sortieren variiert je nachdem, was Sie eigentlich bedeuten. Die lässige Annahme (die die bisherigen Antworten machen) ist eine einmalige Art von Objekten in einem Set. In diesem Fall würde ich sagen, es ist ziemlich viel ein Wurf-up zwischen dem, was @cobbal legt nahe, und was kam man oben mit - wahrscheinlich so etwas wie folgt:
NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
[array addObject:anObject];
[array sortUsingDescriptors:descriptors];
(ich sage, es ist ein Wurf-up, weil @ cobbal Ansatz zwei Autoreleased Arrays erzeugt, so dass der Speicherbedarf verdoppelt. Dies ist inkonsequent für kleine Mengen von Objekten, aber technisch gesehen, weder Ansatz ist sehr effizient.)
Doch , wenn Sie die Elemente in der Menge zu sortier mehr als einmal (und vor allem, wenn es sich um eine regelmäßige Sache ist), ist dies definitiv kein effizienter Ansatz. Sie könnten eine NSMutableArray halten um und halten Sie es mit dem NSSet synchronisiert, dann -sortUsingDescriptors nennen: jedes Mal, aber selbst wenn das Array bereits sortiert ist es erfordert noch N Vergleiche
.Cocoa von selbst einfach nicht einen effizienten Ansatz bietet eine Sammlung in sortierter Reihenfolge zu halten. Java hat eine TreeSet Klasse, die die Elemente unterhält in sortierter Reihenfolge, wenn ein Objekt eingefügt oder entfernt wird, aber Cocoa nicht. Es war genau das Problem, das mich trieb etwas ähnliches für den eigenen Gebrauch zu entwickeln.
Im Rahmen eines Datenstruktur Rahmen I geerbt und neu gestaltet, habe ich ein Protokoll und ein paar Implementierungen für sortierte Sätze . Jede der konkreten Unterklassen wird eine Reihe von verschiedenen Objekten in sortierter Reihenfolge halten. Es gibt immer noch Verfeinerungen vorgenommen werden - die Linie ist, dass es auf dem Ergebnis der -compare basierte Sorten: (welche jedes Objekt in dem Satz implementieren muß) und übernimmt keine noch eine NSSortDescriptor. (Eine Abhilfe zu implementieren -compare. Die Eigenschaft von Interesse an den Objekten vergleichen)
Ein möglicher Nachteil ist, dass diese Klassen sind (derzeit) nicht Subklassen von NS (Mutable) Set, wenn Sie also einen NSSet passieren muss, wird es nicht bestellt werden. (Das Protokoll hat eine -Set Methode haben, die eine NSSet zurückgibt, was natürlich ist ungeordnet.) Ich plane, dass bald zu beheben, wie ich mit den NSMutableDictionary Subklassen im Rahmen getan haben. Feedback ist auf jeden Fall willkommen. : -)
Für iOS ≥ 5.0 und Mac OS X ≥ 10.7 Sie direkt NSOrderedSet
verwenden
NSSet ist eine Sammlung von ungeordneten Objekte. Mit Blick auf Apfel Referenzen Arrays bestellt Sammlungen.
bei NSArray der Suche gibt es eine Diskussion mit Beispielen der Sortierung an
Sie können nicht sortieren NSSet, denn "sortedArrayUsingFunction:" gesetzt Ergebnis als NSArray ...
Und alle oberer Hinweis mit nur Array arbeiten:) Die Arbeit perfekt, und nicht auf andere Art und Weise müssen:) NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];
Seit OS X 10.7 und iOS 5.0 gibt es NSOrderedSet
. Sie können es verwenden, um Objekte im Set zu halten und ihre Ordnung zu halten. NSMutableOrderedSet
hat Verfahren zum Sortieren.
In einigen Situationen kann dies eine Leistungsverbesserung geben, da Sie Objekt erstellen, müssen getrennte nicht wie NSArray
sortierten Elemente zu speichern.