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.
Utiliser un descripteur de tri
NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self"
ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
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 :)
Il y a plusieurs façons:
sortUsingFunction:context:
.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.)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.
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
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];
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);
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é.
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.
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];
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.