2011-11-08 33 views
18

Necesito generar una matriz ordenada de NSNumber s de otra NSArray. Quiero usar el método sortedArrayUsingComparator:. Me encontré con este ejemplo en la documentación de Apple:Cambiar el orden de clasificación de - [NSArray sortedArrayUsingComparator:]

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

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 

Aquí estoy solo con el comparador en un bloque, lo cual está bien. El género en sí, el bit que está oculto para mí, que usa este bloque, parece estar ascendiendo.

Me gustaría saber si puedo solicitar una orden de clasificación diferente externa a este bloque, o hago sólo hay que darle la vuelta al < y > 's (o NSOrderedXXX' s) por ahí?

Respuesta

24

Si desea ordenar descendente, simplemente cambie las comparaciones (o cambie el NSComparisonResult s). No hay necesidad de inflar la API al tener un parámetro ascending: cuando puede controlar eso en el bloque directamente.

4

Sólo cambia la lógica:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 

if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
} 

if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
} 
return (NSComparisonResult)NSOrderedSame; 
}]; 

Para mayor claridad podría ser mejor para hacer de este un método con un nombre similar a: decendingSort.

+1

Por supuesto, esto está muy bien, pero a menos que se adorna con naranja -los comentarios de tráfico-cono escritos en rojo-Jesús-Cristo-tinta que indican que has dado la vuelta al orden, en algún momento más tarde esto podría ser una pesadilla de depuración potencial. La creación de un descriptor de ordenación tendría más sentido y sería autocomplaciente a menos que el rendimiento tuviera un impacto grave. –

+0

@God Un descriptor de ordenación suena genial; proporcione un ejemplo de implementación para comparar. – zaph

4

De la documentación para -sortedArrayUsingComparator::

"devuelve una matriz que enumera los elementos de la matriz receptora en orden ascendente, tal como se determina por el método de comparación especificada por un NSComparator bloque dado."

por lo que tendría que recurrir al uso

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors 

pero por supuesto que significa rodar su propia NSSortDescriptor Primera, que puede satisfacer sus propósitos bien.

+0

+1 para señalar que esto, de hecho, está documentado. Saludos Jeff. –

4

Puedes cambiar el orden de los operadores a la pregunta.

El "bit que está oculto para usted" no le importa ascender o descender, ya que no sabe nada acerca de sus objetos. Es como preguntarle a su compañero de trabajo si un disco de hockey es mayor o menor que una rata almizclera. La implementación interna solo usa un algoritmo de clasificación (que probablemente se determina usando el tamaño de su matriz) y usa su función de bloque para comparar dos objetos.

Cuestiones relacionadas