在内部嵌套的NSDictionary中按值对NSDictionary进行排序

时间:2013-03-12 00:42:06

标签: ios objective-c xcode sorting nsdictionary

我正在开发语言学习应用程序。所以我有一个NSMutableDictionary和'word'作为键。这些键的对象是嵌套的NSDictionaries,其键带有'frequency'和'count'。 NSNumbers是'频率'和'计数'的对象。

这是初始化代码:

 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中。

我想过一个带有以下键的扁平字典: “字”,“频率”,“计数” ......但是我必须列举以检查是否包含了单词。

如果对更好的数据结构策略有任何建议,我很乐意听到它们。我将非常频繁地检查是否包含“单词”,并且不经常会根据“频率”或“计数”进行排序。


我已经看到了很多类似的问题,但它们都是针对扁平字典的。

1 个答案:

答案 0 :(得分: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...
    }