2010-02-21 4 views
0

ma question est: J'ai un dictionnaire avec un objet pour chaque caractère de l'alphabet. Dans ces objets, il y a toutes les valeurs pour un caractère spécifique.compter tous les éléments dans un dictionnaire

Exemple:

alphabetDictionary 
    a 
    apple 
    alien 
    b 
    balloon 
    ball 

Je veux maintenant compter toutes les entrées dans ce dictionnaire:

apple 
alien 
balloon 
ball 
-> 4 

L'utilisation de ce code source ne compte que les objets (a, b, etc.)

NSString *counter = [NSString stringWithFormat:@"Entries (%d)", alphabetDictionary.count]; 

Alors, comment puis-je obtenir toutes les entrées et non les objets a, b, etc?

EDIT 1: Dans la méthode viewDidLoad J'ai:

//Initialize the array. 
charDict = [[NSMutableDictionary alloc] init]; 
alphabetArray = [[NSMutableArray alloc] init]; 

if ([charSpecialArray count] > 0) { 

    //Set object for this character within the dictionary 
    [charDict setObject:charSpecialArray forKey:@"#"]; 
    //fill the alphabetArray with an index value, if this char exists at all 
    [alphabetArray addObject:@"#"]; 
} 

if ([charAArray count] > 0) { 

    [charDict setObject:charAArray forKey:@"A"]; 
    [alphabetArray addObject:@"A"]; 
} 

etc .. pour chaque caractère

suivi par:

totalCounter = 0; 
//Count all keys within the Dictionary 
for (id objectKey in charDict.allKeys) { 
    totalCounter += [[charDict objectForKey:objectKey] count]; 
    NSLog(@"Anzahl: %d", totalCounter); 
} 
NSString *counter = [NSString stringWithFormat:@"TXNs (%d)", totalCounter]; 

self.title = counter; 

les résultats sont à la recherche beaucoup trop élevé:

  • Caractère H a 33 entrées
  • le nombre de caractères H résultats dans: 132
  • m caractères: 1587
  • m caractères count: 6348

Toutes les idées pourquoi ces chefs d'accusation sont aussi importants?

+0

Etes-vous sûr que H a vraiment seulement 33 entrées? – kennytm

+0

Si le # est trop élevé, c'est parce que vous avez plus d'éléments que vous n'en attendez dans les tableaux contenus dans le dictionnaire. Puisque vous n'avez pas montré votre source de données, il n'y a aucun moyen d'aider plus loin. – bbum

Répondre

0

La solution à mon problème est: Je l'ai utilisé NSInteger au lieu de NSUInteger

0

Utilisation fast enumeration:

NSUInteger count = 0; 
for (id objectKey in alphabetDictionary.allKeys) { 
    count += [alphabetDictionary objectForKey:objectKey].count; 
} 
NSString *countStr = [NSString stringWithFormat:@"Entries (%ud)", count]; 
+0

Eh bien .. le comptage lui-même fonctionne .. mais de toute façon le nombre que je reçois est beaucoup trop élevé .. J'ai mis à jour ma question ... – Daniel

+1

Je ne sais pas ce qui ne va pas avec le code, honnêtement. Je ferais des cas de test avec un dictionnaire qui contient un petit ensemble d'objets connus. –

+0

le problème était que j'ai utilisé NSInteger à la place si NSUInteger – Daniel

3

a, b, etc. sont des éléments clés. Les tableaux [apple, alien], etc. sont des objets.

Pour obtenir le nombre total, vous devez faire une boucle dans le dictionnaire et résumé:

NSUInteger total = 0; 
for (NSString* key in alphabetDictionary) { 
    total += [[alphabetDictionary objectForKey:key] count]; 
} 
return total; 

Ou utiliser ce très lent en une ligne:

int count = [[[d allValues] valueForKeyPath:"@[email protected]"] intValue]; 
+0

malheureusement, il reste une erreur avec de très grands nombres du nombre ... – Daniel

1
NSEnumerator *aEnum = [alphabetDictionary objectEnumerator]; 
id object; 
NSUInteger count = 0; 
while(object = [aEnum nextObject]){ 
count += [object count]; // assuming that the object is an array 
} 
NSString *countStr = [NSString stringWithFormat:@"Entries (%ld)",count]; 
// %d NO ofcourse not its not a NSInteger we want a Long 
+0

malheureusement, cela ne fixe pas le nombre élevé problème aussi .. – Daniel

0

Je Je ne suis pas capable de supprimer cette question à cause des votes et de toutes les réponses. Voici donc ma réponse à la question de savoir pourquoi le nombre d'entrées comptés où si élevé:

J'utilisé à la place NSInteger si NSUInteger

0

Je devais faire la même chose avec Swift. J'avais un Dictionary de arrays.Il en résulte le code suivant:

var totalItemsOfAllPages:Int { 
    var totalItemsCount = 0 

    loadedPages.values.array.map({ 
     totalItemsCount += $0.count 
    }) 

    return totalItemsCount 
} 
Questions connexes