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;
    }*/
Qu'est-ce exactement ne comprenez-vous pas? Fondamentalement, il compare toutes les paires d'objets et les swaps de devises, s'ils sont dans le mauvais ordre. (En réalité, cependant, on n'a pas à comparer toutes les paires, n*log(n) sont suffisantes.)
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