2010-08-02 19 views

Répondre

8

Si vous devez absolument utiliser un conteneur de dictionnaire, vous devez utiliser une clé qui peut être triée par ordre dans lequel vous ajoutez des paires valeur/clé. Ainsi, lors de la création de votre dictionnaire, vous utilisez une clé qui est un entier auto-incrémenté ou similaire. Vous pouvez ensuite trier les clés (entières) et récupérer les valeurs associées à ces clés.

Si vous faites tout cela, vous pouvez aussi utiliser un NSMutableArray et ajouter directement des valeurs à la matrice! Ce sera beaucoup plus rapide et nécessite moins de code. Vous venez de récupérer des objets dans l'ordre:

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

NSMutableDictionary ne peut pas faire cela. Jetez un coup d'œil par exemple Matt Gallaghers OrderedDictionary.

+0

Mais pouvez-vous me dire comment utiliser cette classe? – iWatch

2

J'ai écrit une méthode rapide pour prendre un tableau source (d'objets qui sont tous hors d'usage) et un tableau de référence (qui a des objets dans un choix (et totalement arbitraire) order), et retourne un tableau où les éléments du tableau source ont été réorganisés pour correspondre au tableau de référence.

- (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]; 
} 

Notez que c'est très fragile. Il utilise NSArray méthode containsObject:, qui appellera finalement NSObject's isEqual:. Fondamentalement, il devrait fonctionner très bien pour les tableaux de NSString s, NSNumber s, et peut-être NSDate s (n'ont pas encore essayé celui-là), mais en dehors de cela, YMMV. J'imagine que si vous essayiez de passer des tableaux de UITableViewCell s ou d'un autre objet vraiment complexe, il se détruirait totalement lui-même, et écraserait ou renverrait la totalité des ordures. De même, si vous deviez faire quelque chose comme passer un tableau de NSDate s comme tableau de référence et un tableau de NSString s comme le tableau source. En outre, si le tableau source contient des éléments non couverts dans le tableau de référence, ils seront simplement supprimés. On pourrait résoudre certains de ces problèmes en ajoutant un peu de code supplémentaire. Cela dit, si vous essayez de faire quelque chose de simple, cela devrait fonctionner correctement. Dans votre cas, vous pouvez construire le tableau de référence lorsque vous parcourez votre 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]; 

} 

Ensuite, lorsque vous voulez faire une boucle sur vos articles dans l'ordre où ils sont venus, vous juste

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

C'est en fait une solution assez décente. Merci – darwindeeds

+0

Inutile d'utiliser le premier morceau de code dans votre réponse ci-dessus. Une fois que vous avez défini les clés dans le tableau de référence comme ci-dessus où vous avez défini la clé dans referenceArray, vous n'avez plus besoin de manipuler la méthode de tableau "source-reference" (première méthode ci-dessus). ". Vous pouvez simplement parcourir la referenceArray et obtenir les objets de "yourDictionary" dans l'ordre comme "Ganesh" dans le post ci-dessous: pour (clé NSString * dans referenceArray) { // Objets du dictionnaire id objet = [yourDictionary objectForKey: key]; } – programmer

0

En fait, vous avez un tableau de référence de manière de commande alors pourquoi vous devez ajouter une plus array.So je suppose que cette approche n'est pas bonne.S'il vous plaît considérer mon opinion.

0

Bien que la réponse de @GenralMike fonctionne un jeu d'enfant, il pourrait être optimisé en laissant hors du code inutile comme suit:

1) Gardez un tableau pour contenir la référence aux clés du dictionnaire dans l'ordre dans lequel ils sont ajoutés.

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) Maintenant, le « referenceArray » détient toutes les clés afin, vous pouvez donc récupérer des objets à partir de votre dictionnaire dans le même ordre que ils ont été ajoutés au dictionnaire.

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