NSMutableArray De Tri À L'Aide Du Sélecteur
J'ai cherché, cherché sur stackoverflow sans réponses satisfaisantes.
Dans la documentation, il stipule que:
sortUsingSelector: Trie le tableau de
les éléments dans l'ordre croissant, comme
déterminé par la méthode de comparaison
spécifié par un sélecteur de donnée.
- (void)sortUsingSelector:(SEL)comparateur
Les paramètres de comparaison d'Un sélecteur
spécifie la méthode de comparaison à utiliser
pour comparer des éléments dans le tableau. L'
comparateur de message est envoyé à chaque
objet du tableau et son
seul argument d'un autre objet dans le
tableau. La méthode de comparaison devrait
retour NSOrderedAscending si le tableau
est plus petit que l'argument,
NSOrderedDescending si le tableau est
de plus de l'argument, et
NSOrderedSame si elles sont égales.
J'essaie de comprendre comment il fonctionne vraiment. Donc, si j'ai cette méthode dans mon objet à l'intérieur d'
classe array:
- (NSComparisonResult) compareNames: (id) element
{
return [userName compare: [element userName]];
}
Et de l'exécuter avec
[myArray sortUsingSelector:@selector(compareNames:);
Il fonctionne. Le problème est que je ne sais pas pourquoi cela fonctionne. Le type de retour de NSComparisonResult
une montée, Même, ou l'ordre Décroissant. De ce que j'ai en lisant la documentation est
le compareNames méthode est envoyé à chaque objet de la myArray et de comparer les sélectionnés
propriété de l'objet (dans ce cas), nom d'utilisateur avec le nom d'utilisateur d'un autre objet à l'intérieur de la
même tableau. (Comme le [0] tableau est par rapport à l' [1] tableau). Je veux savoir comment cette
tout le processus est en cours.
Mise à jour 1: Algorithme de Tri pour Plusieurs Touches
J'ai raté le ! dans la comparaison. Il devrait être à droite comme ceci:
NSComparisonResult res;
res = [[self userName] compare: [element userName]];
if(res == NSOrderedSame) res = [[self email] compare: [element email]];
return res;
Comme pour le tri en ordre décroissant, vous pouvez utiliser le commutateur ou si pour revenir à la NSComparisonResult valeur par le remplacement de "retourner res" avec ceci:
switch (res)
{
case NSOrderedAscending:
return NSOrderedDescending;
break;
case NSOrderedDescending :
return NSOrderedAscending;
break;
default:
return NSOrderedSame;
break;
}*/
Ne tri toujours Croissant? Que faire si je veux trier en fonction de plusieurs valeurs. Comme le tri par nom, suivies par le tri par e-mail.
OriginalL'auteur sayzlim | 2011-03-03
Vous devez vous connecter pour publier un commentaire.
Pour répondre à vos subquestions dans les commentaires:
Ne tri toujours besoin d'être Ascendant? -
NSOrderedAscending
&NSOrderedDescending
sont juste symbolique ici, vous pourriez mieux penser à eux comme "objet" vient avant "argument" et "objet vient après l'argument" dans l'ordre de tri. E. g. si vous stockez un tableau deNSNumber
puis "1 compareTo:2" doit retournerNSOrderedAscending
si vous souhaitez trier avec l'augmentation de la valeur, etNSOrderedDescending
si vous souhaitez trier avec la diminution de valeur.Comment arriver à faire le tri avec de multiples touches? - Tout algorithme de tri a seulement besoin de savoir si un élément vient avant, après, ou à la même position que l'autre. Comment vous de déterminer qui est à vous. Utiliser deux clés de tri puis dans le pseudo-code de l'algorithme est:
S'étendre à plus de touches ou plus complexes les comparaisons nécessaires.
Suivi de commentaire:
Désolé, mais l'algorithme fourni ne faire un 2 clés de tri, et, en général, en combinant les touches peut pas et c'est du gaspillage.
En anglais tri par deux touches va comme suit: d'abord comparer la première clé de chaque objet, si ils comparent pas égal, puis retour à la commande. Si ils comparent l'égalité de passer ensuite et par rapport à la deuxième clé de chaque objet et le retour de leur commande.
C'est exactement ce que le pseudo-code ci-dessus n'.
La combinaison de plusieurs touches est problématique pour un certain nombre de raisons:
Vous devez les combiner à l'aide d'un séparateur, qui ne peut pas se produire dans les keys. Comme simple exemple, considérons le tri par nom, nom de famille, lorsque vous avez les deux", de jack yolander" et "jacky olander" - un naïf joindre produit "jackyolander" pour les deux, et ils seraient sorte d'égalité. Si vous avez besoin d'un séparateur, qui ne peut pas se produire dans l'une des clés.
Si les touches sont de types différents, par exemple une chaîne de caractères et un nombre, vous ne finissent par se convertir toutes les cordes à la moissonneuse - gaspillage et peut-être même inexacte.
Simple combinaison est gaspillage - vous de générer des objets que vous n'avez pas besoin.
Etc. Il suffit de comparer les touches dans les paires jusqu'à ce que vous trouver deux qui diffèrent ou arriver à la dernière paire. Fonctionne quel que soit le nombre de touches, de tout types, et n'est pas du gaspillage.
Désolé, mais l'algorithme fourni fait 2 clés de tri, et, en général, en combinant les touches ne peuvent pas et c'est du gaspillage.
J'ai raté le et tapé ! lors de la comparaison. Pas étonnant qu'il ne donne pas le résultat que j'attends. Le vôtre fonctionne parfaitement. Je suis désolé que je n'ai pas vérifier mon code correctement avant de le modifier ou d'y répondre. Et merci pour vos réponses détaillées.
vraiment mal expliqué..
OriginalL'auteur CRD
sortUsingSelector
sera à l'aide de Quicksort ou similaire algorithme de tri pour trier le tableau. Algorithmes de tri doivent être en mesure de comparer deux éléments de la collection à être triés et de déterminer où ils doivent apparaître les uns par rapport aux autres dans l'ordre de tri. Si Un comparaître devant B, B après ou à proximité immédiate? Personnalisé de votre méthode de tri (compareNames
dans votre exemple), c'est tout l'algorithme de tri des besoins afin de déterminer qui de la commande.Ont un look à la L'entrée de Wikipedia pour les algorithmes de tri pour un peu de fond sur ce.
Vous ne trouverez pas beaucoup en ligne sur ce, si vous recherchez par exemple "sortUsingSelector". Ce n'est pas un Objectif-C-problème spécifique, à peu près tous les langages de programmation ont des routines de tri qui utilisent un définis par l'utilisateur fonction de comparaison à faire le tri.
OriginalL'auteur Simon Whitaker