2013-03-12 4 views
0

Я работаю над приложением для изучения языка. Поэтому у меня есть NSMutableDictionary с ключом «слово». Объектами для этих ключей являются вложенные NSDictionaries с частотами клавиш и счетчиком. NSNumbers - это объекты для «частоты» и «подсчета».Сортировка NSDictionary по значению внутри внутреннего вложенного NSDictionary

Вот код инициализации:

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

Я отображая часть этого списка в таблице, и я хочу, чтобы отсортировать по частоте «», один из внутренних ключей. Я не могу понять, как это сделать.


В случае, первая мысль: «Почему вы храните это в гнездовой словаре?», Я хотел слова быть ключи, потому что в других частях приложения я часто поиск, чтобы увидеть, если слово в NSMutableDictionary.

Я думал о наличии плоского словаря со следующими ключами: «слово», «частота», «кол-во» ... но я должен был бы перечислить, чтобы проверить включение слов.

Если есть предложения по лучшей стратегии структуры данных, я бы с удовольствием их услышал. Я собираюсь проверять очень часто для включения «слов», и реже будет сортироваться на основе «частоты» или «подсчета».

Я видел много вопросов, подобных этому, но все они предназначены для плоских словарей.

ответ

5

Если я правильно понимаю, используйте keysSortedByValueUsingComparator: так:

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

Затем вы можете перебирать ключи, отсортированные по частоте

for (NSString *word in keysByFrequency){ 
     NSDictionary *detailsDict = self.userWordList[word]; 
     // Do whatever... 
    } 
Смежные вопросы