2012-10-04 25 views
10

Cuando agrego valores en NSMutableDictionary se establece automáticamente la clave. ¿Cómo puedo desactivarlo y organizarlo según el primer conjunto primero y segundo establecer el segundo?Cómo deshabilitar NSDictionary Ordenar automáticamente la clave sabia

NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary]; 

[filteredDictionary setObject:@"abc" forKey:@"1"]; 
[filteredDictionary setObject:@"abc" forKey:@"3"]; 
[filteredDictionary setObject:@"abc" forKey:@"2"]; 
[filteredDictionary setObject:@"abc" forKey:@"5"]; 
[filteredDictionary setObject:@"abc" forKey:@"4"]; 

NSLog(@"%@",filteredDictionary); 

current output: 
{ 
1 = abc; 
2 = abc; 
3 = abc; 
4 = abc; 
5 = abc;  
} 

but i want 
{ 
1 = abc; 
3 = abc; 
2 = abc; 
5 = abc;  
4 = abc; 
} 

¿Hay alguna manera de desactivar la ordenación según la clave?

+1

Sé que este es el verdadero problema con el Diccionario. Pero puedo ayudarlo con la manera alternativa de hacerlo. Además, habrá cambios menores en el acceso a los valores. Además, no entiendo cuál es el problema que enfrenta debido a esto, después de todo, solo necesita acceder a ellos mediante KeyValue. –

+0

@amitrajput sí, ese es el punto –

+0

Solo ordena las claves al emitir la cadena de descripción, no cambia el diseño de la memoria que se basa en una tabla hash. Si enumera a través de él, no se ordenará ya que está destinado a darle acceso rápido. –

Respuesta

2

Aquí está una manera de hacerlo:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) { 

    if (obj1 > obj2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (obj1 < obj2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 

NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary]; 

for (NSString *index in sortedKeys) { 
    [orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index]; 
} 

filteredDictionary = orderedDictionary; 
+0

Este código no puede compilarse ya que no hay ningún método 'addObject' disponible en [NSMutableDictionary] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference. html), preguntándose cómo funcionó para OP. –

+0

Wow, debo haber estado en crack cuando escribí eso ... ¡Lo arreglaré! Gracias por detectarlo. –

1

NSDictionary no está destinado a ser ordenado. Puede ordenarlo obteniendo todas las claves usando allKeys y clasificando esa matriz a su gusto. A continuación, recorra este conjunto y obtenga los valores correspondientes.

+0

, pero ¿cómo si sabes por favor dime. –

+0

Ver los mensajes de Joachim y Simon. – Rengers

4

NSDictionary no está ordenando sus claves, el orden de las teclas en un diccionario es no definido ya que es una colección desordenada.

Eso significa que no se puede confiar en el orden de los elementos cuando FETCH/imprimirlas a menos que utilice keysSortedByValueUsingSelector: o keysSortedByValueUsingComparator: para ordenarlos mientras recuperaba ellos.

También puede ver esto en el manual de allKeys;

Valor de retorno
Una nueva matriz que contiene las claves del diccionario, o una matriz vacía si el diccionario no tiene entradas.

Discusión
El orden de los elementos en la matriz es no definido.

No hay manera de mantener las llaves/valores ordenados como desee en un NSDictionary, así que si necesitas les ordenó en el mismo orden en que están añadidos, que básicamente tiene dos opciones;

  • Añadir a/eliminarlos de una colección ordenada - tales como NSArray - al mismo tiempo que se agregan a la NSDictionary, y el uso que colección para el acceso ordenado.
  • Agregue un campo a los datos que está agregando al diccionario que cuenta para cada agregación, luego use ese campo con keysSortedByValueUsingComparator: para pedirlo cuando obtenga todas las claves de la matriz.
1

En NSDictionary no obtendrá los datos que se va a insertar.
Puede usar una matriz si desea obtener datos de acuerdo con los datos que está insertando,

Cuestiones relacionadas