49 votes

Comment trier un NSMutable Array avec des NSNumbers dedans?

Je suis en train d'essayer de créer un tableau de scores, et je suis nul en tableaux en objective c (en fait, en général, objective c est un défi pour moi), donc je ne peux pas comprendre comment trier. J'essaie de faire quelque chose comme ça (pseudocode, j'écris ceci dans le style actionscript car je suis plus à l'aise avec) :

highscores.addObjectToArray(score)
highscores.sort(ascending)

Mais je n'arrive pas à comprendre... J'ai vu d'autres discussions à ce sujet, mais elles utilisent des fichiers plist et des trucs et je ne connais pas assez bien l'objective c pour apprendre d'eux.

137voto

ohhorob Points 6994

Voudriez-vous faire cela de la manière courte?

Si vous avez un tableau mutable d'instances de NSNumber:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey="self" ascending=NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];

Sympa et facile :)

Vous pouvez également effectuer un tri similaire avec des descripteurs sur des tableaux immuables, mais vous obtiendrez une copie, au lieu d'un tri sur place.

27voto

Wevah Points 17636

[highscores sortUsingSelector:@selector(compare:)];

Devrait fonctionner s'ils sont définitivement tous des NSNumber.

(Ajouter un objet est :

[highscores addObject:score];

)

Si vous voulez trier en descendant (du plus élevé au plus bas) :

10.6/iOS 4 :

[highscores sortUsingComparator:^(id obj1, id obj2) {
    if (obj1 > obj2)
        return NSOrderedAscending;
    else if (obj1 < obj2)
        return NSOrderedDescending;

    return NSOrderedSame;
}];

Autrement, vous pouvez définir une méthode de catégorie, par exemple :

@interface NSNumber (CustomSorting)

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber;

@end

@implementation NSMutableArray (CustomSorting)

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber {
    return [otherNumber compare:self];
}

@end

Et l'appeler :

[highscores sortUsingSelector:@selector(reverseCompare:)];

3voto

J'ai essayé la réponse fournie par ohhorob, mais les objets étaient toujours triés par ordre alphabétique. Puis j'ai trouvé ceci dans une autre réponse (https://stackoverflow.com/a/4550451/823356):

J'ai modifié mon NSSortDescriptor et il trie maintenant numériquement.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey="score"
                                               ascending:YES
                                              comparator:^(id obj1, id obj2) {
    return [obj1 compare:obj2 options:NSNumericSearch];
}];

J'ai juste pensé que je le laisserais ici car cela a résolu mon problème de "tri alphabétique des NSNumbers"

2voto

Mike M Points 932

Pour ce que ça vaut, voici une autre méthode abrégée :

NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5];

NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
            return [n1 compare:n2];
        }];
NSLog(@"Croissant : %@", asc);

NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
           return [n2 compare:n1];
       }];
NSLog(@"Décroissant : %@", dec);

0voto

user3641723 Points 1

Ce code triera un NSMutableArray de NSNumber par ordre croissant :

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2];
}];

Ce code triera un NSMutableArray de NSNumber par ordre décroissant :

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2] * -1; // inverser l'énumération
}];

Le code utilise le fait que la méthode compare: de NSNumber renvoie un NSComparisonResult allant de -1 à 1. En multipliant le résultat de la comparaison par -1, on inverse le résultat et donc on inverse le tri pour le mettre dans l'ordre décroissant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X