OC将后台返回的城市列表快速的排序分组算法

场景需求

后台会返回下图这样的一个数据,我们可以根据cityCode这个字段的信息,将城市按照首字母进行排序分类做成下图这个界面.

OC将后台返回的城市列表快速的排序分组算法_第1张图片
OC将后台返回的城市列表快速的排序分组算法_第2张图片

做法分析

我们其实可以看到,我们其实是要对下划线之后的首字母进行排序,这个首字母首先我们要保证数据库中他和汉字是一一对应的,因为汉字是有多音字的,这边没有什么好的办法,因为后台返回的字段都是小写的,所以这里也没有做统一的处理.

刚开始其实想到过字典然后值对应一个数组,也想过一些别的办法,但总感觉一方面写起来难受,一方面起始数据还是不好处理.经过一段时间的算法探索,想到了一个很巧妙的办法.

在初次接触编程的时候,大家应该都接触过一个东西,叫做ascii,这个东西能够有效地将字母和数字对应起来,所以做法就有了.创建一个大的数组来保存26个小数组,这些小数组负责存贮对应的首字母.利用小写字母对应的ascii减去97其实就是我们需要将字母插入到哪一个小数组里了.这样子我们对所有的模型遍历一次其实就已经分好组了,当我们需要排除掉空的小数组时,只需要对这26个小数组进行遍历一次就好了.

当然了十万条以下的数据,无论你做不做优化算法,其实差别不大,但也是精益求精.

示例代码

    /**
     对城市按照首字母分组
     */
    - (NSArray *)p_makeCityGroup:(NSArray *)cityArray{
        NSMutableArray *letterDictArray = [NSMutableArray array];
        //创建26个数组用来存储
        for (int i = 0; i < 26; i ++) {
            NSMutableArray *letterCityArray = [NSMutableArray array];
            [letterDictArray addObject:letterCityArray];
        }
        
        for (CCityModel *model in cityArray) {
            
            //将城市首字母转化为asic码
            int asciiCode = [model.cityCode characterAtIndex:3];
            int index = asciiCode - 97;
            [letterDictArray[index] addObject:model];
        }
        return [letterDictArray copy];
    }

    /**
     改变数据源
     */
    - (void)p_changeDataSource:(NSArray *)cityArray{
        
        //字母头
        NSMutableArray *sectionArray = [NSMutableArray array];
        //cell数据源
        NSMutableArray *dataArray = [NSMutableArray array];
        
        //排除掉字母中没有的数据
        for (int i = 0; i < cityArray.count; i ++) {
            NSArray *letterCityArray = cityArray[i];
            if (letterCityArray.count > 0) {
                
                //asci码转字母
                int assciiCode = i + 65;
                NSString *sectionStr = [NSString stringWithFormat:@"%c", assciiCode];
                [sectionArray addObject:sectionStr];
                [dataArray addObject:letterCityArray];
            }
        }
        
        //赋值数据源并刷新
        self.sectionArray = [sectionArray copy];
        self.dataArray = [dataArray copy];
        [self.tableView reloadData];
    }

你可能感兴趣的:(OC将后台返回的城市列表快速的排序分组算法)