2013-03-12 4 views
0

Je travaille sur une application d'apprentissage des langues. J'ai donc un NSMutableDictionary avec 'mot' comme clés. Les objets de ces clés sont imbriqués NSDictionaries avec les touches 'frequency' et 'count'. NSNumbers sont les objets pour 'frequency' et 'count'.Trier NSDictionary par valeur dans un NSDictionary interne imbriqué

Voici le code d'initialisation:

NSString* path = [[NSBundle mainBundle] pathForResource:@"french_top_50000" 
                ofType:@"txt"]; 
NSString *fh = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL]; 
self.userWordlist = [[NSMutableDictionary alloc] init]; 

for (NSString *word in fh) { 
    NSArray *keyArray = [[NSArray alloc] initWithObjects:@"frequency", @"count", nil]; 
    NSArray *objectArray = [[NSArray alloc] initWithObjects:frequency, count, nil]; 
    NSDictionary *detailsDict = [[NSDictionary alloc] initWithObjects:objectArray forKeys:keyArray]; 

    [self.userWordlist setObject:detailsDict forKey:word]; 
} 

J'afficher une partie de cette liste dans un tableau, et je veux trier par « fréquence », l'une des clés internes. Je n'arrive pas à comprendre comment faire ça.


Dans le cas où la première pensée est: « Pourquoi avez-vous stocker dans un dictionnaire imbriqué? », Je voulais que les mots à clés, car dans d'autres parties de l'application que je recherche souvent pour voir si un mot est dans le NSMutableDictionary.

Je pensais avoir un dictionnaire plat avec les clés suivantes: 'mot', 'fréquence', 'count' ... mais je devrais énumérer pour vérifier l'inclusion des mots.

S'il existe des suggestions pour une meilleure stratégie de structure de données, j'aimerais les entendre. Je vais vérifier très fréquemment l'inclusion des «mots» et, plus rarement, je vais trier en fonction de la «fréquence» ou du «compte». J'ai vu beaucoup de questions semblables à ceci mais elles sont toutes pour les dictionnaires plats.

Répondre

5

Si je comprends bien, utilisez keysSortedByValueUsingComparator: comme ceci:

NSArray *keysByFrequency = [self.userWordlist keysSortedByValueUsingComparator:^NSComparisonResult(NSDictionary* obj1, NSDictionary* obj2) { 
     return [obj1[@"frequency"] compare:obj2[@"frequency"]]; 
    }]; 

Ensuite, vous pouvez itérer clés triées par leur fréquence

for (NSString *word in keysByFrequency){ 
     NSDictionary *detailsDict = self.userWordList[word]; 
     // Do whatever... 
    }