2011-03-31 26 views
5

Tengo una matriz de NSMutableDictionaries, que contiene (entre otros) la ubicación clave. Necesito ordenar la matriz para ingresarla en una tabla. En la parte superior debe ser N, debajo debe ser A, y debajo debe ser R. Por lo tanto, en orden: ¿Cómo puedo ordenar una matriz en el orden: N - A - R?Obj/C: ordenar una matriz en una orden personalizada

EDIT: Puedo pedir examinado dos variables, pero estoy usando más de 2 variables (7 en total) ...

Gracias,

Respuesta

6

Si la matriz es mutable, se puede ordenarlo usando los métodos -sortUsing ... De lo contrario, puede crear una nueva matriz ordenada utilizando los métodos -sortedArrayUsing ... Por ejemplo, hay -sortUsingComparator: y -sortedArrayUsingComparator: métodos que toman un bloque de comparación como parámetro. Sólo tiene que suministrar un bloque que compara dos objetos usando el orden de clasificación personalizada, así:

[myArray sortUsingComparator:^(id firstObject, id secondObject) { 
    NSString *firstKey = [firstObject valueForKey:@"location"]; 
    NSString *secondKey = [secondObject valueForKey:@"location"]; 
    if ([firstKey stringEqual:@"N"] || [lastKey stringEqual:@"R"]) 
     return NSOrderedAscending; 
    else if ([firstKey stringEqual:secondKey]) 
     return NSOrderedSame; 
    else 
     return NSOrderedDescending; 
}]; 

Hay una discusión muy profunda de ordenar matrices, con ejemplos, en el documento Collections Programming Topics.

+0

@Caleb gracias Caleb, eso me ayudó un poco. Todavía estoy luchando con la clasificación de más ubicaciones, N aparece en la parte superior, pero todas las letras a continuación aparecen juntas, pero en orden aleatorio. Mi lista de ubicación total debe ser N-G-B-A-F-C. Entonces, por ejemplo, todas las A están juntas, pero no directamente debajo de B. El orden ordenado es N-B-C-F-A-G. Estoy usando el bloque que usaste muchas veces, ¿quizás algo anda mal allí ...? – Joetjah

+0

@Caleb, por supuesto, usar este bloque varias veces no funcionará (y se desvía al azar). Publiqué el comentario anterior un poco demasiado rápido sin pensar lo suficiente. Sin embargo, usar dos teclas funciona para mí, pero usar más de 2 (que necesito) es donde lucho. ¿Alguna sugerencia? – Joetjah

+0

@Joetjah, no estoy seguro de lo que quiere decir con el uso del bloqueo varias veces. No necesariamente recomendaría usar exactamente ese código, especialmente si tienes más que solo los tres valores que indicaste originalmente. Realmente estaba dando algo rápido y sucio como ejemplo. Una mejor forma de obtener más valores podría ser definir el orden como una cadena: @ "NBCFAG". Luego, puede encontrar el valor de ubicación de cada diccionario en la cadena y comparar sus índices. Esto escala mucho mejor a un mayor número de valores posibles. – Caleb

Cuestiones relacionadas