我的数据库查询会产生一系列字符串,如:
(
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循环实现,但输入数组可以包含数百条记录。所以,我需要一种足够快的方法。
提前致谢。
答案 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);
}