场景需求
后台会返回下图这样的一个数据,我们可以根据cityCode
这个字段的信息,将城市按照首字母进行排序分类做成下图这个界面.
做法分析
我们其实可以看到,我们其实是要对下划线
之后的首字母进行排序,这个首字母首先我们要保证数据库中他和汉字是一一对应的,因为汉字是有多音字的,这边没有什么好的办法,因为后台返回的字段都是小写的,所以这里也没有做统一的处理.
刚开始其实想到过字典然后值对应一个数组
,也想过一些别的办法,但总感觉一方面写起来难受,一方面起始数据还是不好处理.经过一段时间的算法探索,想到了一个很巧妙的办法.
在初次接触编程的时候,大家应该都接触过一个东西,叫做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];
}