場(chǎng)景需求
后臺(tái)會(huì)返回下圖這樣的一個(gè)數(shù)據(jù),我們可以根據(jù)cityCode
這個(gè)字段的信息,將城市按照首字母進(jìn)行排序分類(lèi)做成下圖這個(gè)界面.
做法分析
我們其實(shí)可以看到,我們其實(shí)是要對(duì)下劃線
之后的首字母進(jìn)行排序,這個(gè)首字母首先我們要保證數(shù)據(jù)庫(kù)中他和漢字是一一對(duì)應(yīng)的,因?yàn)闈h字是有多音字的,這邊沒(méi)有什么好的辦法,因?yàn)楹笈_(tái)返回的字段都是小寫(xiě)的,所以這里也沒(méi)有做統(tǒng)一的處理.
剛開(kāi)始其實(shí)想到過(guò)字典然后值對(duì)應(yīng)一個(gè)數(shù)組
,也想過(guò)一些別的辦法,但總感覺(jué)一方面寫(xiě)起來(lái)難受,一方面起始數(shù)據(jù)還是不好處理.經(jīng)過(guò)一段時(shí)間的算法探索,想到了一個(gè)很巧妙的辦法.
在初次接觸編程的時(shí)候,大家應(yīng)該都接觸過(guò)一個(gè)東西,叫做ascii
,這個(gè)東西能夠有效地將字母和數(shù)字對(duì)應(yīng)起來(lái),所以做法就有了.創(chuàng)建一個(gè)大的數(shù)組
來(lái)保存26個(gè)小數(shù)組
,這些小數(shù)組負(fù)責(zé)存貯對(duì)應(yīng)的首字母
.利用小寫(xiě)字母
對(duì)應(yīng)的ascii
減去97
其實(shí)就是我們需要將字母插入
到哪一個(gè)小數(shù)組里了.這樣子我們對(duì)所有的模型遍歷一次其實(shí)就已經(jīng)分好組了,當(dāng)我們需要排除掉空的小數(shù)組
時(shí),只需要對(duì)這26個(gè)小數(shù)組
進(jìn)行遍歷
一次就好了.
當(dāng)然了十萬(wàn)條
以下的數(shù)據(jù),無(wú)論你做不做優(yōu)化算法,其實(shí)差別不大,但也是精益求精.
示例代碼
/**
對(duì)城市按照首字母分組
*/
- (NSArray *)p_makeCityGroup:(NSArray *)cityArray{
NSMutableArray *letterDictArray = [NSMutableArray array];
//創(chuàng)建26個(gè)數(shù)組用來(lái)存儲(chǔ)
for (int i = 0; i < 26; i ++) {
NSMutableArray *letterCityArray = [NSMutableArray array];
[letterDictArray addObject:letterCityArray];
}
for (CCityModel *model in cityArray) {
//將城市首字母轉(zhuǎn)化為asic碼
int asciiCode = [model.cityCode characterAtIndex:3];
int index = asciiCode - 97;
[letterDictArray[index] addObject:model];
}
return [letterDictArray copy];
}
/**
改變數(shù)據(jù)源
*/
- (void)p_changeDataSource:(NSArray *)cityArray{
//字母頭
NSMutableArray *sectionArray = [NSMutableArray array];
//cell數(shù)據(jù)源
NSMutableArray *dataArray = [NSMutableArray array];
//排除掉字母中沒(méi)有的數(shù)據(jù)
for (int i = 0; i < cityArray.count; i ++) {
NSArray *letterCityArray = cityArray[i];
if (letterCityArray.count > 0) {
//asci碼轉(zhuǎn)字母
int assciiCode = i + 65;
NSString *sectionStr = [NSString stringWithFormat:@"%c", assciiCode];
[sectionArray addObject:sectionStr];
[dataArray addObject:letterCityArray];
}
}
//賦值數(shù)據(jù)源并刷新
self.sectionArray = [sectionArray copy];
self.dataArray = [dataArray copy];
[self.tableView reloadData];
}