iOS学习笔记iOS学习开发

检索内容排序

2017-07-06  本文已影响104人  李贤立

在一个庞大的数据源里要对关键字搜索的结果进行排序。排序要求:

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];

}

```

上一篇下一篇

猜你喜欢

热点阅读