web-dev-qa-db-fra.com

Trier un tableau NS dans l'ordre décroissant

J'ai une NSArray de NSNumber objets que j'ai triés avec succès dans l'ordre croissant en utilisant les éléments suivants:

[myArray sortedArrayUsingSelector:@selector(compare:)]

Cependant, je dois trier ceci dans l'ordre décroissant. Je suppose que compare: ne trie que par ordre croissant. Bien que je puisse inverser la NSArray, je suis curieux de savoir s'il existe un moyen plus simple ou plus efficace de procéder.

EDIT: J'ai trouvé cette question qui fournit un moyen simple d'inverser l'itération d'une NSArray:

for (id someObject in [myArray reverseObjectEnumerator])

Cela fonctionne bien, je suppose que c'est une solution simple et agréable, mais je suis curieux de savoir s'il existe un moyen de spécifier le tri par ordre décroissant.

34
Jorge Israel Peña

Utiliser un descripteur de tri

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
80
JeremyP

Une autre façon, imo, c'est aussi Nice: écrivez un autre reverseCompare avec category:

@implementation NSNumber (Utility)

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

La bonne chose est que vous pouvez réutiliser partout et ne pas écrire la boucle avec itération inverse. La mauvaise chose est que vous devez écrire plus de code :)

12
vodkhang

Il y a plusieurs façons:

  1. Ecrivez une fonction de comparaison et transmettez-la à sortUsingFunction:context:.
  2. Utilisez sortUsingComparator:, qui prend un bloc. (Uniquement disponible dans Mac OS X 10.6 et versions ultérieures et iOS 4.0 et versions ultérieures.)
  3. Utilisez sortUsingDescriptors: et transmettez un tableau d'au moins un descripteur de tri dont la propriété ascending est false.

Dans les deux premiers cas, votre comparaison doit simplement renvoyer la négation de ce que le comparateur que vous utilisez normalement (par exemple, compare:) a renvoyé. Le dernier implique moins de code personnalisé, donc c'est ce que j'utiliserais.

6
Peter Hosey

utilisez la méthode sortarrayusingcomparator comme ça

NSArray *sortedArray = [array sortedArrayUsingComparator:
^NSComparisonResult(id obj1, id obj2){
        return [obj2 compare:obj1];
    }];

en inversant l'ordre des objets, vous obtiendrez un ordre décroissant 

6
Bent El-Eslam

J'ai un mutableArray et je veux trier par ordre décroissant avec la touche "nombre". "nombre" clé est une chaîne comme "12345", "12346". De cette façon que j'avais essayé et très bien regarder. J'espère vous aider!

NSComparisonResult result;

NSArray *arrTem = [multableArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if([obj1 valueForKey:@"number"] > [obj2 valueForKey:@"number"])
         result = NSOrderedDescending;
    result = NSOrderedSame;
}];

return [[NSMutableArray alloc]initWithArray:arrTem];
3
AmyNguyen

Par exemple, les données sont comme ceci et nous voulons trier NSArray sur la base de la clé sId.  

<__NSArrayM 0x7ffc725af1d0>(
{
    sId = 3;
    vName = ABC;
},
{
    sId = 10;
    vName = DEF;
},
{
    sId = 9;
    vName = GHI;
},
{
    sId = 7;
    vName = JKL;
},
{
    sId = 1;
    vName = MNO;
}
)

La solution est comme ci-dessous

NSArray *sortedArray = [arrOptions sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if ([[obj1 valueForKey:@"sId"] integerValue] > [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([[obj1 valueForKey:@"sId"] integerValue] < [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
NSLog(@"Sorted Service Array is ::%@",sortedArray);
2
Hardik Thakkar

Le site Web Dr. Touch dispose d'une implémentation Nice d'une catégorie sur NSArray pour créer un tableau à tri automatique. Cela pourrait être modifié pour conserver le tri dans l'ordre approprié. 

1
gnuchu

le sélecteur Comare doit renvoyer NSComparisonResult. C'est en fait votre fonction, vous pouvez donc écrire une autre fonction, qui renvoie le résultat opposé à trier par ordre décroissant.

1
Nava Carmon

Si vous avez besoin de ABCD en ordre croissant, utilisez le code suivant

NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];
0
Hardik Mamtora

nous pouvons le faire simplement en utilisant sortUsingSelector. Le code comme suit;

NSMutableArray *arr=[[NSMutableArray alloc]initWithObjects: ..objects.. ];
//Can also use NSArray.
[arr sortUsingSelector:@selector(compare:options:)];
NSString *temp;
int i,j;
i=0;
j=[arr count];
for(i=0;i<([arr count]-1);i++)
{
    temp=[arr objectAtIndex:i];
    [arr replaceObjectAtIndex:i withObject:[arr objectAtIndex:j]];
    [arr replaceObjectAtIndex:j withObject:temp];
    j--;
}
NSLog(@"New array is:%@",arr);

Vous pouvez penser que CE QU'UN STUPIDE REPONSE c'est: D: D En fait, je ne taquine personne. Mais en logique simple, nous pouvons trier un tableau par ordre décroissant de cette manière. Pas besoin d'utiliser n'importe quel type de descriptors ou d'autres objets compliqués. Et ce sera plus facile pour les programmeurs débutants.

0
soorej babu