2010-08-02 15 views

Respuesta

8

Si debe usar un contenedor de diccionario, debe usar una clave ordenable por el orden en el que agrega pares clave-valor. Por lo tanto, al crear su diccionario, utiliza una clave que es un número entero de incremento automático o similar. Luego puede ordenar las claves (enteras) y recuperar los valores asociados con esas teclas.

Si hace todo eso, sin embargo, también puede usar un NSMutableArray y agregar valores directamente a la matriz. Será mucho más rápido y requerirá menos código. Que acaba de recuperar objetos en orden:

for (id obj in myArray) { /* do stuff with obj... */ } 
7

NSMutableDictionary no puedo hacer eso. Eche un vistazo a, por ejemplo, Matt Gallaghers OrderedDictionary.

+0

¿Pero puede decirme cómo usar esta clase? – iWatch

2

escribí un método rápido para tomar una matriz de origen (de los objetos que se encuentran todos fuera de servicio) y una matriz de referencia (que tiene los objetos de una deseada (y totalmente arbitraria) orden), y devuelve una matriz donde los elementos de la matriz de origen se han reorganizado para que coincida con la matriz de referencia.

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray 
{ 
    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < [referenceArray count]; i++) 
    { 
     if ([sourceArray containsObject:[referenceArray objectAtIndex:i]]) 
     { 
      [returnArray addObject:[arrReference objectAtIndex:i]]; 
     } 
    } 
    return [returnArray copy]; 
} 

Tenga en cuenta que esto es muy frágil. Utiliza el método NSArraycontainsObject:, que finalmente llamará al NSObject's isEqual:. Básicamente, debería funcionar muy bien para matrices de NSString s, NSNumber s, y tal vez NSDate s (aún no lo han probado), pero fuera de eso, YMMV. Imagino que si intentas pasar arreglos de UITableViewCell u otro objeto realmente complejo, se dañaría por completo y se bloqueará o devolverá la basura total. Del mismo modo, si hiciera algo así como pasar una matriz de NSDate s como la matriz de referencia y una matriz de NSString s como la matriz de origen. Además, si la matriz fuente contiene elementos que no están cubiertos en la matriz de referencia, simplemente se descartarán. Uno podría abordar algunos de estos problemas agregando un pequeño código adicional.

Dicho todo esto, si está tratando de hacer algo simple, debería funcionar bien. En su caso, podría construir la matriz de referencia mientras recorre su setValue:forKey:.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (//whatever you are looping through here) 
{ 

    [yourDictionary setValue://whatever forKey:key]; 
    [referenceArray addObject:key]; 

} 

Entonces, cuando se desea un bucle sobre los elementos en el orden en que entró, que acaba de

for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray]) 
+0

Esta es una solución realmente bastante decente. Gracias – darwindeeds

+0

No hace falta utilizar la primera pieza de código en su respuesta anterior. Una vez que haya establecido las claves en la matriz de referencia como lo hace arriba, donde estableció la clave en la matriz de referencia, ya no necesita meterse con el método de la matriz "fuente-referencia" (primer método anterior) porque una matriz contiene valores en "ORDEN" ". Simplemente puede iterar sobre el array de referencia y obtener los objetos de "yourDictionary" en el orden indicado por "Ganesh" en la publicación siguiente: for (clave NSString * en referenceArray) { // obtener el objeto del diccionario id object = [yourDictionary objectForKey: clave]; } – programmer

0

En realidad tiene una matriz de referencia de manera orden entonces por qué tiene que añadir a una más array.So creo que este enfoque no es bueno. Considere mi opinión.

0

Aunque respuesta @GenralMike 's funciona una brisa, podría ser optimizado al dejar fuera del código innecesario de la siguiente manera:

1) Mantener una matriz para contener referencia a las claves del diccionario en el orden en que se añaden.

NSMutableArray *referenceArray = [[NSMutableArray alloc] init]; 
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init]; 

for (id object in someArray) { 

    [yourDictionary setObject:object forKey:someKey]; 
    [referenceArray addObject:someKey]; // add key to reference array 

} 

2) Ahora el "referenceArray" contiene todas las llaves con el fin, para que puedas recuperar objetos de su diccionario en el mismo orden en que fueron originalmente añadidos al diccionario.

for (NSString *key in referenceArray){ 
    //get object from dictionary in order 
    id object = [yourDictionary objectForKey:key]; 
} 
Cuestiones relacionadas