检索内容排序
在一个庞大的数据源里要对关键字搜索的结果进行排序。排序要求:
1,字数少的排前面;
2,字数相同的,关键字靠前的排前面。
思路:可以把检索到的结果(一个数组),扩展为一个二维数组,二维数组的元素都是三个:检索结果,检索结果的长度,关键字在检索结果中的位置。
第一步,以检索结果的长度先排序,可以冒泡排序。
第二步,进行关键字位置排序,可以冒泡排序。前提:需要相同的关键字作为一个数据源数组。
转变:把第一步和第二步的前提结合,重新思考,要得到相同长度的关键字数组,可以设一个宏,检索词条长度的最大值(我以所有词牌名为例 SCIMostCipaimingLength),由1开始遍历,分别建立一个数组盛放,遍历结束,立即移除子数组为空的元素,得到检索结果长度的排序。由此不需要专门以检索结果的长度进行排序,原来的二维数组三个元素可以简化为两个元素。但是二维数组最终须扩展成为四维数组。
以下为验证成功的代码。数据源是1667个词牌名。
```
/** * 排序 * 字数少的排前面,相同字数关键字排前面 * @param array 原有数组 * @param crucial 关键字 * return 排好序的数组 */- (NSArray *)sequenceSearchResultWithArray:(NSArray*)array crucial:(NSString *)crucial { NSMutableArray*> *arrayM = [NSMutableArray array]; // 字数从多到少排序 for (NSInteger i = 0; i < SCIMostCipaimingLength; i ++) { NSMutableArray*arr1 = [NSMutableArray array]; [array enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.length == i) { NSMutableArray *arr = [NSMutableArray arrayWithCapacity:2]; [arr addObject:obj]; [arr addObject:[NSNumber numberWithUnsignedInteger:[obj rangeOfString:crucial].location]]; [arr1 addObject:arr]; } }]; [arrayM addObject:arr1]; } // 移除个数为空的元素 NSMutableArray*arrM = [NSMutableArray array]; for (NSInteger i = SCIMostCipaimingLength - 1; i >= 0; i --) { [arrM addObject:arrayM[i]]; } [arrM enumerateObjectsUsingBlock:^(NSArray * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.count == 0) { [arrayM removeObjectAtIndex:arrM.count - idx - 1]; } }]; // 相同的字数,关键字靠前的排前面 [arrayM enumerateObjectsUsingBlock:^(NSMutableArray* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { // 冒泡排序 for (int i = 0; i < obj.count - 1; i++) { for (int j = 0; j < obj.count - 1 - i; j++) { if ([obj[j][1] intValue] > [obj[j + 1][1] intValue]) { NSMutableArray *temp = obj[j]; obj[j] = obj[j + 1]; obj[j + 1] = temp; } } } }]; // 重新获取字符串数组 NSMutableArray *realArray = [NSMutableArray array]; [arrayM enumerateObjectsUsingBlock:^(NSMutableArray* _Nonnull arr1, NSUInteger idx, BOOL * _Nonnull stop) {
[arr1 enumerateObjectsUsingBlock:^(NSMutableArray * _Nonnull arr2, NSUInteger idx, BOOL * _Nonnull stop) {
[realArray addObject:arr2.firstObject];
}];
}];
return [realArray mutableCopy];
}
```