逐个过滤NSDictionary作为一个类型的值

时间:2015-09-07 23:36:30

标签: ios objective-c nsdictionary

目前,我正在使用一个名为NSDictionary的大型listOfAllWords,其中包含一个单词,以及相应的分数:

WORD  : SCORE
-------------
hello : 100
have  : 90
help  : 80
held  : 70
hot   : 60
hemp  : 50
...

我的目标是,在用户输入时,根据得分在列表中提供最多3个建议。

例如,如果用户只输入了“ h ”,那么3个建议将按顺序为“hello”,“have”和“help”。但是,如果用户输入了已经“ hel ”,然后推荐“hello”,“help”和“hold”。

基于类似的过滤UITableViews的范例,过滤的方法是做这样的事情:

    for (word* food in [listOfAllWords allKeys]){
        NSRange nameRange = [word rangeOfString:userInput options:NSCaseInsensitiveSearch];
        if(nameRange.location != NSNotFound
        {
            [filteredData addObject:word];
        }
    }

但是,我遇到的问题是如何合并过滤器以包含得分组件,以便它包含按其得分排名的推荐。非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

最直接的方法可能是这样的:

NSArray* matchingWords = [listOfAllWords.allKeys filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", userInput];
NSArray* sortedMatches = [matchingWords sortedArrayUsingComparator:^NSComparisonResult (NSString* word1, NSString* word2) {
    // Look up the score of each word and compare them. I put word2's score on the left to get descending (highest first) result.
    return [listOfAllWords[word2] compare:listOfAllWords[word1]];
}];
// Limit to 3 matches
if (sortedMatches.count > 3)
    sortedMatches = [sortedMatches subarrayWithRange:NSMakeRange(0, 3)];

绝对有可能提高速度,但除非并且直到您测量到真正的性能问题,否则不要打扰。

答案 1 :(得分:0)

您可以创建第二个字典,其中包含键和值,如本答案中所述:https://stackoverflow.com/a/19387825/364015

然后对键进行排序,并按排序顺序查找值以创建一组有序的字符串。