2010-08-04 16 views
34

Tengo una NSArray de NSNumber objetos que he éxito ordenados en orden ascendente utilizando la siguiente:NSArray en orden descendente

[myArray sortedArrayUsingSelector:@selector(compare:)] 

Sin embargo, tengo que resolver esto en descendente orden. Considero que compare: solo ordena en orden ascendente. Si bien puedo revertir el NSArray, tengo curiosidad acerca de si existe o no una manera más simple o más efectiva de hacer esto.

EDITAR: He encontrado this question que proporciona una forma sencilla de revertir iterar una NSArray:

for (id someObject in [myArray reverseObjectEnumerator]) 

Esto funciona bien, supongo que es una solución simple agradable, pero tengo curiosidad en cuanto a si no hay una forma de especificar la ordenación en orden descendente.

+0

Esta respuesta es corta, dulce e inteligente: http://stackoverflow.com/a/586529/999934 – Rob

Respuesta

75

Utilice un descriptor de tipo

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

Gracias. Terminé usando esto y me gusta cómo es realmente simple. –

+0

@Blaenk: Hola, he retrocedido su edición porque 'arrayWithObject:' no era un error tipográfico. Realmente existe ese método para NSArray. Además, los espacios después de los dos puntos son deliberados. – JeremyP

+1

El error tipográfico era que tenías arayWithObject, no arrayWithObject. Entonces me dejé llevar. Pero está bien. –

12

Otra forma, la OMI, también es agradable: escribir otra reverseCompare con la categoría:

@implementation NSNumber (Utility) 

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

Lo bueno es que se puede reutilizar en todas partes y no tiene que escribir el bucle con iterate inversa. Lo malo es que tiene que escribir más código :)

1

comare selector tiene que devolver NSComparisonResult. En realidad, es su función, por lo que puede escribir otra función, que devuelve el resultado opuesto para ordenar en orden descendente.

+1

No necesariamente. Si los objetos son instancias de una clase incorporada de Cocoa (como NSString), tendría que categorizar su método de comparación personalizado en la clase. –

6

hay algunas maneras:

  1. escribir una función de comparación y pasarlo a sortUsingFunction:context:.
  2. Use sortUsingComparator:, que toma un bloque. (Solo disponible en Mac OS X 10.6 y posterior e iOS 4.0 y posterior.)
  3. Use sortUsingDescriptors:, y pase una matriz de al menos un descriptor de ordenamiento cuya propiedad ascending sea falsa.

En los primeros dos casos, su comparación simplemente debe devolver la negación de lo que el comparador que usa normalmente (por ejemplo, compare:) devuelto. El último implica menos código personalizado, así que es lo que usaría.

1

Dr. Touch La página web tiene una buena puesta en práctica de una categoría en NSArray para crear una matriz de auto-clasificación. Esto podría modificarse para mantener el orden en el orden apropiado.

0

Si usted necesita en función de ABCD de forma ascendente a continuación, utilizar el código siguiente

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

método de uso sortarrayusingcomparator así

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

invirtiendo el orden de los objetos obtendrá un orden descendente

+0

Funciona como un amuleto, solía ordenar una matriz de NSString. Necesita una matriz ordenada para aplicar esto. – andreskwan

2

Por ejemplo, los datos son así y queremos ordenar NSArray en función de la clave sId.

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

solución es la siguiente

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); 
3

Tengo un mutableArray y quiero ordenar en orden descendente con la tecla "número". La tecla "número" es una cadena como "12345", "12346". De esta forma lo había intentado y visto muy bien. ¡Espero ayudarte!

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]; 
+0

use ctrl + k para escribir códigos en el futuro. buena suerte .. –

+0

¡¡¡Gracias !!!!!!!! – AmyNguyen

0

podemos hacerlo simplemente usando sortUsingSelector. El código de la siguiente manera;

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); 

Puedes pensar que WHAT A STUPID ANSWER es: D: D En realidad, no estoy molestando a nadie. Pero en lógica simple, podemos ordenar la matriz en orden descendente de esta manera. No es necesario utilizar ningún tipo de descriptors o cualquier otro material complicado. Y será más fácil para los programadores de nivel de entrada.

-1

Utilice el siguiente código para ordenar la matriz sobre la base de tecla en la que desea ordenar gastroenteritis transmisible array (por ejemplo, nombre, código, dirección, etc ... emp_id)

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO]; 

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
return [array sortedArrayUsingDescriptors:sortDescriptors]; 
Cuestiones relacionadas