Question

Quel est le moyen le plus efficace pour trier les objets dans un NSSet / NSMutableSet basé sur une propriété des objets dans le jeu? En ce moment, la façon dont je fais est en parcourant chaque objet, les ajouter à une NSMutableArray et trier ce tableau avec NSSortDescriptor.

Était-ce utile?

La solution

essayez d'utiliser

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

Modifier : Pour iOS ≥ 4,0 et Mac OS X ≥ 10.6 vous pouvez utiliser directement

[mySet sortedArrayUsingDescriptors:descriptors];

Autres conseils

La « manière la plus efficace » pour trier un ensemble d'objets varie en fonction de ce que vous entendez réellement. L'hypothèse décontractée (que les réponses précédentes font) est une sorte unique d'objets dans un ensemble. Dans ce cas, je dirais que c'est à peu près un entre Toss-ce que @cobbal et suggère ce que vous êtes venu avec - probablement quelque chose comme ce qui suit:

NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
    [array addObject:anObject];
[array sortUsingDescriptors:descriptors];

(je dis qu'il est un toss-up parce que l'approche de @ cobbal crée deux tableaux autoreleased, de sorte que le double de l'empreinte mémoire. Ceci est sans conséquence pour les petits ensembles d'objets, mais techniquement, ni approche est très efficace.)

Cependant , si vous le tri des éléments dans l'ensemble plus d'une fois (et surtout si elle est une chose régulière) c'est certainement pas une approche efficace. Vous pouvez garder un NSMutableArray autour et maintenir synchronisé avec le NSSet, puis appelez -sortUsingDescriptors: à chaque fois, mais même si le tableau est déjà triée, il faudra encore des comparaisons N

.

Le cacao par lui-même ne fournit pas seulement une approche efficace pour maintenir une collection dans l'ordre. Java a une classe TreeSet qui maintient les éléments dans l'ordre de tri à chaque fois qu'un objet est inséré ou retiré, mais le cacao ne fonctionne pas. Ce fut précisément ce problème qui m'a conduit à développer quelque chose de similaire pour mon propre usage.

Dans le cadre d'une structure de données cadre I hérité et remanié, je crée un protocole de et quelques implémentations pour des ensembles triés. Tous les sous-classes concrètes maintiendra un ensemble d'objets distincts dans l'ordre. Il y a encore des améliorations à apporter - le tout étant qu'il trie en fonction du résultat de -compare: (qui chaque objet dans l'ensemble doit mettre en œuvre) et n'a pas encore accepter une NSSortDescriptor. (Une solution consiste à mettre en œuvre -compare:. Pour comparer les biens d'intérêt sur les objets)

Un inconvénient possible est que ces classes sont (actuellement) pas sous-classes de Set NS (Mutable), donc si vous devez passer un NSSet, il ne sera pas ordonné. (Le protocole a une méthode -set qui retourne un NSSet, ce qui est évidemment non ordonnée.) Je prévois de rectifier que bientôt, comme je l'ai fait avec les sous-classes NSMutableDictionary dans le cadre. Vos commentaires sont les bienvenus sans aucun doute. : -)

Pour iOS ≥ 5.0 et Mac OS X ≥ 10,7 vous pouvez utiliser directement NSOrderedSet

scroll top