我正在开发语言学习应用程序。所以我有一个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中。
我想过一个带有以下键的扁平字典: “字”,“频率”,“计数” ......但是我必须列举以检查是否包含了单词。
如果对更好的数据结构策略有任何建议,我很乐意听到它们。我将非常频繁地检查是否包含“单词”,并且不经常会根据“频率”或“计数”进行排序。
我已经看到了很多类似的问题,但它们都是针对扁平字典的。
答案 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...
}