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.

War es hilfreich?

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

scroll top