在没有匹配项

时间:2016-09-27 13:46:07

标签: ios objective-c

我的数据库查询会产生一系列字符串,如:

XBARCD,

ZBAF,

DFBJ,

UJKD,

CFGKLO,

BCM,

AHUJD ...... )

如果搜索文本是ABC,我必须安排上面的数组,以便按以下顺序对数组进行排序:

1)包含搜索文本所有条款的所有字符串

2)包含搜索文本的任意两个术语的所有字符串

3)包含至少一个搜索文本词的所有字符串

因此,结果数组应该是以下形式:

X BA R C D,//在上面,因为它包含所有三个ABC

//这3个元素包含搜索文本的任意两个术语
  的 BC 男,   DF的Ĵ的 A 下,   ž的 AB

//这两个元素包含搜索文本的任何一个术语

A HUJD,    C FGKLO

UJKD //不包含

结果可以使用基本for循环实现,但输入数组可以包含数百条记录。所以,我需要一种足够快的方法。

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用嵌套for循环确实需要很长时间。为了展平for循环(将N平方问题变为2-N),在排序之前索引每个结果的分数。试试这个:

NSArray *results = @[@"XBARCD",
                     @"ZBAF",
                     @"DFBJ",
                     @"UJKD",
                     @"CFGKLO",
                     @"BCM",
                     @"AHUJD"];

NSArray *searchTerms = @[@"A", @"B", @"C"];

NSMutableDictionary *scores = NSMutableDictionary.new;

for (NSString *result in results) {
    [scores setObject:[self scoreForResult:result withSearchTerms:searchTerms] forKey:result];
}

NSArray *sortedArray = [results sortedArrayUsingComparator:^NSComparisonResult(NSString *result1, NSString *result2) {
    NSInteger score1 = [scores[result1] integerValue];
    NSInteger score2 = [scores[result2] integerValue];

    return score1 < score2;
}];

// To sort alphabetically
sortedArray = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(NSString *result1, NSString *result2) {
    return [result1 compare:result2];
}];

NSLog(@"Sorted array: %@", sortedArray);

评分方法是:

- (NSNumber *)scoreForResult:(NSString *)result withSearchTerms:(NSArray *)searchTerms {

    NSInteger score = 0;

    for (NSString *searchTerm in searchTerms) {

        if ([result containsString:searchTerm])
            score++;
    }

    return @(score);
}