web-dev-qa-db-fra.com

Comment trier un tableau NSMutableArray contenant des nombres?

J'essaie de créer un tableau des scores les plus élevés et j'aspire les tableaux de l'objectif C (en fait, l'objectif général est difficile pour moi), donc je ne peux pas comprendre comment trier. J'essaie de faire quelque chose comme ça (speudocode, j'écris ceci dans un style actionscript parce que je suis plus à l'aise avec ça):

highscores.addObjecttoArray(score)
highscores.sort(ascending)

Mais je ne peux pas le comprendre ... J'ai vu d'autres discussions à ce sujet, mais leur utilisation utilise des fichiers plist et des trucs et je ne connais pas assez l'Objectif C pour en tirer des leçons.

49
meman32

Aimeriez-vous le faire à court terme?

Si vous disposez d'un tableau mutable d'instances NSNumber:

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

Agréable et facile :)

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

137
ohhorob

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

Devrait fonctionner s'ils sont définitivement tous NSNumbers.

(Ajouter un objet c'est:

[highscores addObject:score];

)

Si vous souhaitez trier par ordre décroissant (le plus élevé en premier):

10.6/iOS 4:

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

    return NSOrderedSame;
}];

Sinon, 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 appelez ça:

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

27
Wevah

J'ai essayé la réponse fournie par ohhorob, mais les objets étaient toujours triés par ordre alphabétique. Ensuite, je suis tombé sur cela dans une autre réponse ( https://stackoverflow.com/a/4550451/823356 ):

J'ai changé 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];
}];

Je pensais juste que je déposerais cela ici car cela a résolu mon problème de "tri alphabétique des NSNumbers"

3
thereleventfridge

Pour tout 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(@"Ascending: %@", asc);

NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
           return [n2 compare:n1];
       }];
NSLog(@"Descending: %@", dec);
2
Mike M

Ce code triera un NSMutableArray de NSNumber dans l'ordre croissant:

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

Ce code triera un NSMutableArray de NSNumber dans l'ordre décroissant:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2] * -1; // reverse the enum
}];

Le code utilise le fait que la méthode NSNumber compare: renvoie un NSComparisonResult compris entre -1 et 1. La multiplication du résultat de la comparaison par -1 inverse le résultat et inverse ainsi le tri dans l'ordre décroissant.

0
user3641723

la distance est une clé et son lien de valeur (flottant ou double)

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance"
ascending:YES
comparator:^(id obj1, id obj2)
                     {
                  return [obj1 compare:obj2 options:NSNumericSearch];
                     }];
NSArray *myArray = [NSArray arrayWithArray:arraySubCat];
myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]];
arraySubCat = [myArray copy];
0
Rahul Patel