2011-04-03 4 views
1

Je suis très nouveau en Objective-C et n'ai pas eu beaucoup d'expérience avec C alors s'il vous plaît excusez mon ignorance. Ma question est la suivante, est-il possible d'ajouter un tableau à un dictionnaire? Voici ce que je ferais en Python, et il est très pratique:NSDictionary contenant un NSArray

if 'mykey' not in mydictionary: 
    mydictionary['mykey']=[] # init an empty list for 'mykey' 
mydictionary['mykey'].append('someitem') 

Je veux quelque chose comme ça, ça marche:

NSMutableDictionary *matchDict = [NSMutableDictionary dictionary]; 
NSMutableArray *matchArray = [NSMutableArray array]; 

while (blah): 
    [matchDict setObject: [matchArray addObject: myItem] forKey: myKey]; 

Je regardai partout avec pas de chance, à peu près à abandonner . Tout commentaire sera apprécié!

Répondre

5

Ce n'est pas vraiment différent de ce que vous avez fait en python.

NSMutableDictionary *matchDict = ... 
NSMutableArray *matchArray = ... 
[matchDict setObject:matchArray forKey:someKey]; 
// This is same as: mydictionary['mykey']=[] 


// 'matchArray' is still a valid pointer so.. 
[matchArray addObject:someObj]; 

// or later if 'matchArray' were no longer in scope 
// it would look like this: 

NSMutableArray* arrayForKey = [matchDict objectForKey:someKey]; 
[arrayForKey addObject:someObj]; 

// or more simply: 
[[matchDict objectForKey:someKey] addObject:someObj]; 

// this is same as: mydictionary['mykey'].append('someitem') 

modifier

Donc, si vous avez besoin d'ajouter des tableaux pour plus d'une clé que vous pourriez faire ceci:

Dans une série de deux clés:

NSArray *keys = [NSArray arrayWithObjects:@"key0",@"key1", nil]; 

Et un dictionnaire ...

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]]; 

Voici comment vous pouvez créer un tableau pour chaque clé:

for (id key in keys) { 

    // Create a new array each time... 

    NSMutableArray *array = [NSMutableArray array]; 

    // and insert into dictionary as value for this key 

    [dict setObject:array forKey:key]; 
} 

Espérons que vous donne l'idée.

+0

Fait sens. Merci beaucoup Firoze! – Mohawke

+0

Si la réponse de Firoze est ce que vous recherchiez, vous devriez l'accepter. –

+0

J'ai essayé ce code et il ajoute un tableau, mais ce n'est pas du tout la même chose que Python. Si j'ai quatre valeurs avec une clé de un et deux autres valeurs avec une clé de deux, je finirais avec: {1: ['un', 'deux', 'trois', 'quatre'], 2: [ 'one', 'two'} en utilisant Python. Ce qui précède me donnera {1: ['un', 'deux', 'trois', 'quatre'], 2: ['un', 'deux', 'trois', 'quatre']} Python utilise la clé à ajouter comme un filtre. – Mohawke

1

Voici comment faire:

[matchDict setObject:matchArray forKey:@"myKey"]; 

je devais demander this question moi-même il y a 3 mois, donc ne vous inquiétez pas trop à demander;)

+0

Merci! Ouais, avoir du mal à comprendre ça. Juste obtenir une erreur ou un dictionnaire vide. – Mohawke

+0

@Mohawke Les extraits que nous avons publiés ici devraient certainement fonctionner, donc votre problème pourrait être lié à une autre partie de votre code. Si vous pouviez le télécharger quelque part, je serais ravi de l'examiner et de vous aider à le faire fonctionner. – antalkerekes

+0

Fondamentalement, je suis en boucle dans le système de fichiers et le calcul du hachage MD5 pour chaque fichier. Si un hash correspond, j'ai un fichier en double. Pour chaque hachage, je voulais ajouter le chemin du fichier pour les hachages correspondants faisant le hachage de la clé et le tableau correspond au [code-objectif-c] (http://www.darkartistry.com/content/view/246/38/ Je suis un programmeur Python et je commence juste avec Objective-C et je n'ai pas eu beaucoup de problèmes jusqu'à ce moment. [Code Python] (http://www.darkartistry.com/content/view/242/41/). Je pense que Python m'a gâté. J'ai essayé les exemples fournis, mais ils ne fonctionnent pas pour moi. – Mohawke

0

Après réflexion j'ai fini résoudre le problème. Si vous voulez remplir un tableau pour chaque touche, vous faites dynamiquement comme ceci:

While (something) 
{ 
    // check if key is already in dict. 
    if ([_matchesDictionary objectForKey: hashKey]) 
     { 
      // pull existing array from dict and add new entry to array for said key. 
      NSMutableArray *keyArray = [_matchesDictionary objectForKey: hashKey]; 
      [keyArray addObject: newPath]; 

      // put the array back into the dict for said key. 
      [_matchesDictionary setObject: keyArray forKey: hashKey]; 

    } else { 

      // create new array, assign empty array to said key in dict. 
      NSMutableArray *keyArray = [NSMutableArray array]; 
      [keyArray addObject: newPath]; 
      [_matchesDictionary setObject: keyArray forKey: hashKey]; 

    } 

} 

Cela donnera {('value1', valeur2' , etc ...): 'somekey'}

Merci @Antal et @Firoze pour toute l'aide, vous m'avez aidé à le résoudre. Juste besoin d'arrêter de penser "Python". Si l'un d'entre vous voit un problème ou une meilleure mise en œuvre, faites-le moi savoir.

Questions connexes