2009-10-30 4 views

Respuesta

21

No, NSDictionary no mantiene el orden de inserción de sus claves.

Si necesita un diccionario que mantiene el orden de inserción, me gustaría sugerir el uso de la CHDataStructures framework, que tiene una clase CHOrderedDictionary (que es un descendiente de NSMutableDictionary). La documentación para CHOrderedDictionary dice:

Un diccionario que enumera las claves en el orden en que se insertan.

Las siguientes operaciones adicionales se proporcionan para tomar ventaja de la Orden:

-firstKey

-lastKey

-keyAtIndex:

-reverseKeyEnumerator

entradas clave-valor se insertan como en un diccionario normal, incluida la sustitución de valores para las claves existentes, como se detalla en - setObject: forKey :. Sin embargo, se usa una estructura adicional en paralelo para rastrear el orden de inserción, y las claves se enumeran en ese orden. Si una clave para agregar no existe actualmente en el diccionario, se agrega al final de la lista, de lo contrario, el orden de inserción de la clave no cambia.

+1

solo para completar ... ¡es una biblioteca, no un marco! Saludos ... – stk

4

No, no está ordenado. Puede usar una matriz de teclas para recordar una orden si es necesario, pero los diccionarios son bolsas conceptualmente desordenadas de pares clave-valor.

11

teclas de NSDictionary no se mantienen en orden, pero se pueden conseguir y ordenarlos, E. G:

for (key in [[myDict allKeys] sortedArrayUsingSelector:@selector(compare:)]) 
... 
+1

Rápido y fácil, gracias. Pero, ¿la aplicación tiene que realizar la operación de clasificación cada vez que recorre el ciclo? Si es así, haría el tipo una vez y pondré ese resultado en una variable, luego iteraré sobre la variable. – arlomedia

+2

@arlomedia No, el ciclo for evalúa primero la expresión de recopilación y luego itera sobre el resultado. Entonces la clasificación solo ocurre una vez en este ejemplo. –

+1

la pregunta solicita ordenada (en orden de inserción), no ordenada – user102008

4

algo que me gustaría añadir en caso de que alguien está buscando para este y se tropieza en este tema:

Hay un lugar de fácil trabajo en torno a los diccionarios ordenados, y eso es HAV ing a Array, que contiene las claves en el orden que desee. Luego tener un diccionario desordenado, pero puede acceder a cada clave en orden usando las teclas de la matriz:

NSString *key = [arrayOfKeys objectAtIndex:0]; 
NSString *stringAtIndexZero = [unorderedDictionary objectForKey:key]; 
Cuestiones relacionadas