2009-12-21 13 views
20

Tengo una matriz de objetos NSString que debo ordenar descendiendo.Matriz de ordenación (NSArray) en orden descendente

Como no encontré ninguna API para ordenar la matriz en orden descendente me acerqué de la siguiente manera.

Escribí una categoría para NSString como se indica a continuación.

- (NSComparisonResult)CompareDescending:(NSString *)aString 
{ 

    NSComparisonResult returnResult = NSOrderedSame; 

    returnResult = [self compare:aString]; 

    if(NSOrderedAscending == returnResult) 
     returnResult = NSOrderedDescending; 
    else if(NSOrderedDescending == returnResult) 
     returnResult = NSOrderedAscending; 

    return returnResult; 
} 

Entonces me ordenan la matriz mediante la declaración

NSArray *sortedArray = [inFileTypes sortedArrayUsingSelector:@selector(CompareDescending:)]; 

Es esta solución correcta? hay una mejor solución?

Respuesta

54

Puede utilizar NSSortDescriptor:

NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:NO selector:@selector(localizedCompare:)]; 
NSArray* sortedArray = [inFileTypes sortedArrayUsingDescriptors:@[sortDescriptor]]; 

Aquí se utiliza localizedCompare: comparar las cuerdas, y pasar a la NO ascendente: opción para ordenar en orden descendente.

+0

desde 'sortDescriptorWithKey' 10.6 aboveI han utilizado siguiente declaración. [[NSSortDescriptor alloc] initWithKey: nil ascendente: NO]; gracias ... –

+0

De hecho, debería haber mencionado eso - no se olvide de la -autorelease though :) –

+0

¡Funciona increíble! ¡Gracias! –

4
NSSortDescriptor *sortDescriptor; 
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"length" ascending:NO]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[wordsArray sortUsingDescriptors:sortDescriptors]; 

Usando este código podemos ordenar la matriz en orden descendente en función de la longitud.

2

o simplificar su solución:

NSArray *temp = [[NSArray alloc] initWithObjects:@"b", @"c", @"5", @"d", @"85", nil]; 
NSArray *sortedArray = [temp sortedArrayUsingComparator: 
         ^NSComparisonResult(id obj1, id obj2){ 
          //descending order 
          return [obj2 compare:obj1]; 
          //ascending order 
          return [obj1 compare:obj2]; 
         }]; 
NSLog(@"%@", sortedArray); 
Cuestiones relacionadas