2008-11-21 7 views
1

Étant nouveau pour Cocoa, et ne connaissant probablement pas toutes les classes potentielles disponibles qui ont déjà cette fonctionnalité soigneusement enveloppée dans une classe OO, voici une demande d'algorithme. Quel est le meilleur pari pour compter combien de fois une clé particulière se produit dans un tableau de plusieurs instances NSDictionary?Algorithme: Maintenir le nombre de paires clé/valeur dans NSDictionary

Essentiellement ma structure de données (dans ce cas un NSArray) peut contenir plusieurs instances NSDictionary à un moment donné, chacun ayant les mêmes clés, potentiellement des valeurs différentes. Certaines valeurs se répètent. J'aimerais savoir combien de fois une clé/valeur particulière apparaît. Exemple:

{ 
    foo => 1, 
    bar => 2 
} 
{ 
    foo => 1, 
    bar => 3 
} 
{ 
    foo => 2, 
    bar => 1 
} 

Dans ce cas, je suis intéressé que foo=>1 2 fois et est survenue foo=>2 1 fois est survenue. La construction d'une instance de NSCountedSet est-elle la meilleure façon de procéder? Peut-être une liste C liée?

Répondre

2
NSDictionary * dict1 = [[NSDictionary alloc] initWithObjectsAndKeys: 
         [NSNumber numberWithInt:1], @"foo", 
         [NSNumber numberWithInt:2], @"bar", nil]; 
NSDictionary * dict2 = [[NSDictionary alloc] initWithObjectsAndKeys: 
         [NSNumber numberWithInt:1], @"foo", 
         [NSNumber numberWithInt:3], @"bar", nil]; 
NSDictionary * dict3 = [[NSDictionary alloc] initWithObjectsAndKeys: 
         [NSNumber numberWithInt:2], @"foo", 
         [NSNumber numberWithInt:1], @"bar", nil]; 
NSArray * arrayOfDictionaries = [[NSArray alloc] initWithObjects: 
           dict1, dict2, dict3, nil]; 

// count all keys in an array of dictionaries (arrayOfDictionaries): 

NSMutableDictionary * countKeys = [[NSMutableDictionary alloc] initWithCapacity:0]; 
NSCountedSet * counts = [[NSCountedSet alloc] initWithCapacity:0]; 

NSArray * keys; 
NSString * pairString; 
NSString * countKey; 
for (NSDictionary * dictionary in arrayOfDictionaries) 
{ 
    keys = [dictionary allKeys]; 
    for (NSString * key in keys) 
    { 
     pairString = [NSString stringWithFormat:@"%@->%@", key, [dictionary valueForKey:key]]; 
     if ([countKeys valueForKey:pairString] == nil) 
     { 
      [countKeys setValue:[NSString stringWithString:pairString] forKey:pairString]; 
     } 
     countKey = [countKeys valueForKey:pairString]; 
     { [counts addObject:countKey]; } 
    } 
} 

NSLog(@"%@", counts); 

[counts release]; 
[countKeys release]; 

[arrayOfDictionaries release]; 
[dict1 release]; 
[dict2 release]; 
[dict3 release];
+0

Ouf! C'était plus difficile que je ne le pensais. Comme Brian C. Lane l'a dit, vous voudrez peut-être repenser la façon dont cela est mis en œuvre. –

+0

Merci James. Je n'étais pas au courant que NSCountedSet existait. J'aimerais que cela soit mentionné dans le livre de Hillegass. :-) À votre santé! –

+0

eJames: Vous faites vous-même le travail dont vous n'avez pas besoin. Voir ma réponse: http://stackoverflow.com/questions/307695/algorithm-keeping-count-of-keyvalue-pair-in-nsdictionary#307898 –

4

Vous voudrez peut-être repenser la façon dont vous structurez vos données. Je suivrais quelque chose comme ceci en ajoutant à NSArray au lieu d'essayer de le découvrir plus tard. Vous pouvez créer une nouvelle classe pour gérer l'ajout et la suppression des données afin que vous puissiez conserver vos propres comptes des données.

1
NSCountedSet *keyCounts = [NSCountedSet set]; 
for (NSDictionary *dict in myDictionaries) 
    [keyCounts unionSet:[NSSet setWithArray:[dict allKeys]]]; 
+0

J'ai eu ce tort la première fois, aussi. Il veut réellement le nombre de paires uniques, pas seulement le nombre de clés. Si l'un des dictionnaires a une valeur de 2 pour la clé "foo", et un autre a une valeur de 3 pour la même clé, cela devrait compter comme deux entrées uniques dans l'ensemble. –

+0

Oui, je sais. Je répondais plus à votre entrée que la question originale. La question originale est beaucoup plus difficile à faire avec les collections primitives; Je pense qu'il serait mieux servi en fabriquant des objets modèles. –

+0

Vous avez probablement raison sur les objets du modèle. Merci pour le heads-up sur mon code. À l'origine, je ne considérais pas NSCountedSet, mais je peux voir que votre extrait serait utile. Le downvote sur cette réponse n'était pas le mien, mais il obtient un upvote de moi maintenant. –

Questions connexes