Aider le tri d'un NSArray à travers deux propriétés (avec NSSortDescriptor?)
Je suis un peu une NSSortDescriptor n00b. Je pense, néanmoins, qu'il est le bon outil pour ce que je dois faire:
J'ai un NSArray composé d'objets avec des touches, dire, "nom" et "temps". Au lieu de verbaliser, voici un exemple:
input:
name: time
B: 4
C: 8
B: 5
C: 4
A: 3
C: 2
A: 1
A: 7
B: 6
desired output:
name: time
A: 1 <---
A: 3
A: 7
C: 2 <---
C: 4
C: 8
B: 4 <---
B: 5
B: 6
Si les valeurs sont triées par "le temps" et regroupées par "nom". Vient d'abord parce qu'il avait la plus petite valeur de temps, et toutes les valeurs pour Un viennent l'une après l'autre. Puis vient C, il a la deuxième plus petite valeur de temps de toutes ses valeurs. J'ai indiqué les valeurs qui déterminent la façon dont les noms sont triés; au sein de chaque nom de groupe, le tri est par le temps.
Comment puis-je obtenir de l'entrée à la sortie NSArray la manière la plus efficace? (cpu et de la mémoire-sage, pas nécessairement au niveau du code.) Comment pourrais-je construire le NSSortDescriptors pour cela, ou utiliser toute autre méthode? Je ne veux pas rouler mes propres sauf si c'est la façon la plus efficace.
OriginalL'auteur Jaanus | 2010-02-03
Vous devez vous connecter pour publier un commentaire.
La
sortedArrayUsingDescriptors:
NSArray
méthode n'est plus de ce dont vous avez besoin:Un filtrage avec
NSPredicate
est également requise:Je n'ai aucune idée si c'est la méthode la plus efficace, mais jusqu'à ce que vous avez des raisons de croire qu'il est à l'origine de problèmes il n'y a pas besoin de s'inquiéter de l'incidence sur les performances. Il est prématuré d'optimisation. Je ne voudrais pas avoir des préoccupations au sujet de la performance de cette méthode. Vous avez confiance en la cadre sinon vous allez réécrire (ce qui minent le point du cadre) en raison d'une non fondé de la paranoïa.
Ohhh je vois. Je n'avais pas remarqué que l'ordre des groupes est dépendante du temps.
J'ai mis à jour le code pour qu'il soit réellement répondre à la question!
Merci, cela ressemble à ce dont j'ai besoin. Je vais essayer plusieurs approches à partir des réponses et d'en rendre compte.
Upvoted la réponse. Souhaite que je pourrais déduire d'un quart de point pour les conséquences de performance de commentaires. Il n'est pas prématuré d'optimisation de considérer l'efficacité des algorithmes. L'expression est prise en parlait de plus en plus, et ce n'est pas ce que c'est. Prendre le temps de considérer la complexité des algorithmes, et si il ya une meilleure façon, c'est juste bon génie.
OriginalL'auteur Benedict Cohen
Ma solution est la suivante:
Vous pouvez essayer
OriginalL'auteur Ha Duyen Hoa
Je voudrais créer une nouvelle classe appelée
ItemGroup
, puis ajouter un supplément de ivar appelégroup
à votre classe d'article:Ensuite, vous pouvez effectuer les opérations suivantes:
Ce code parcourt le tableau non trié, garder une trace de la durée minimale pour chaque groupe, et aussi réglage le groupe pour chaque élément. Avec ce complet, il vous suffit de trier sur
group.time
ettime
:Et qui devrait faire l'affaire!
Mise à JOUR: Notez que vous pourriez obtenir beaucoup de meilleures performances si vous avez été en mesure d'affecter les groupes tout droit sorti de la porte. Quelque chose comme ceci:
Maintenant, si vous maintenez une liste de groupes quelque part (ils pourraient même aller dans un tableau quelque part, en cas de besoin):
Et au lieu de définir la noms de vos éléments de données, vous pouvez définir leur groupe:
Cela permettrait de simplifier considérablement la boucle utilisée pour définir le groupe de fois:
Et, si tu voulais vraiment être flamboyant rapide à ce sujet, vous pouvez même modifier la propriété setter pour votre
time
de propriété pour définir le groupe de fois à la volée:Noter que vous devez être sûr que
group
avait été mis en avant de régler l'heure. Avec cela en place, vous n'auriez pas besoin que le tri boucle à tous. Le sortDescriptors serait suffisant.Ah. Maintenant je vois. C'est beaucoup plus intéressant.
Avez-vous définir le type d'objet qui est stocké dans le tableau d'origine? c'est à dire une classe personnalisée que vous pouvez ajouter ivars?
Oui, c'est ma classe et je pourrais ajouter ivars. Je ne me vois pas comment cela pourrait les aider. Les données sont volatiles et les nouvelles valeurs peuvent arriver lors de l'exécution. À un moment donné, j'ai juste un instantané des données que j'ai besoin de trier de cette façon.
De toutes les réponses jusqu'à présent, j'aime ces le meilleur, en particulier les groupes d'approche, qui remettra son rapport. Je pense que cela a O(n) la complexité, beaucoup mieux que mon actuel naïf O(n*n). Affectation hors de la porte ce serait génial, mais la situation réelle est plus complexe et dépend de l'environnement qui n'est pas connu lors de l'enregistrement.
OriginalL'auteur e.James
Je suis allé faire un peu de code (n'essayez pas de course ou aller vraiment sur elle alors il pourrait y avoir quelques erreurs, mais c'est l'idée générale) pour faire ce que vous cherchez. Performance sage, il ne sera probablement pas le meilleur si vous commencez à courir dans d'énormes quantités de données. Je suis sûr qu'il ya une meilleure façon de le faire, mais j'ai envie de faire la manière la plus basique comme une "solution temporaire" réponse.
En fin de compte, vous vous retrouverez avec ce que vous cherchez dans
sortedarray
.OriginalL'auteur mjdth
Vous pouvez utiliser NSSortDescriptor. Ces descripteurs sont très utiles car ils vous permettent de faire plusieurs clés de tri ainsi seule clé de tri. Le cas de la sensibilité et de l'insensibilité est également facilement réalisables. J'ai trouvé un exemple détaillé ICI
OriginalL'auteur guPra
Si vous avez à faire plus compliqué tri le juste "croissant" peut prendre soin de (dis tri NSString comme si elles étaient des flotteurs), vous pourriez faire quelque chose comme ceci:
OriginalL'auteur james_womack