日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

城市列表排序

發布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 城市列表排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

要實現如圖效果的選擇界面,我們應該怎么做呢?

首先我們有一個城市數據列表,假設是無序的,那么我們首先要對其進行排序。

假設我們從服務器獲取到數據,并將其存在一個數組中,數組中每一個地址都是一個CCCityModel,該model包含了地址相關信息。以下是排序處理:

//將服務器獲取到的citiesArray數組進行分組排序- (NSMutableArray *)convertAToZArray:(NSMutableArray *)citiesArray{//用來存放分組之后的數據NSMutableDictionary *cityDic = [NSMutableDictionary dictionary];//按首字母分組,存放在cityDic中for (int i = 0; i < [citiesArray count]; i++) {CCCityModel *cityModel = citiesArray[i];//firstCharactor方法在下邊,是將城市的第一個字母取出NSString *firstChar? = [self firstCharactor:cityModel.name];/*判斷最大的字典里所有的key是否包含當前取到的城市首字母,如果包含,則先取出對應key的數組value, 把新的值存放到對應的數組里,然后把這個數組重新賦值給這個key,完成添加。如果不包含則吧對應的 城市放到初始化的小數組中,然后新建一個鍵值對,把這個小數組賦值給這個key*/ NSMutableArray *groupArray = nil;if([[cityDic allKeys] containsObject:firstChar]){groupArray = [cityDic objectForKey:firstChar];[groupArray addObject:cityModel];[cityDic setObject:groupArray forKey:firstChar];}else{groupArray = [[NSMutableArray alloc] initWithObjects:cityModel, nil];[cityDic setObject:groupArray forKey:firstChar];}} //此時cityDic中已經將所有城市按照首字母分組好了//所有包含的首字母按照A-Z排序NSMutableArray *allCityFirstCharArray = [NSMutableArray arrayWithArray:[[cityDic allKeys] sortedArrayUsingSelector:@selector(compare:)]];//按照A-Z的順序重組數據,對分組的城市進行排序, allCityArray存放最終數據NSMutableArray *allCityArray = [NSMutableArray array];for (int i = 0; i < [allCityFirstCharArray count]; i++) {//取出對應字母分組的數組NSMutableArray *groupArray = [cityDic objectForKey:allCityFirstCharArray[i]];//對其按照A-Z的順序排序, nickNameSort為排序方法NSArray *sortArr = [ccArray sortedArrayUsingFunction:nickNameSort context:NULL];//存放首字母以及對應排序后的城市NSDictionary *dic = [NSDictionary dictionaryWithObject:sortArr forKey:allCityFirstCharArray[i]];//加入最終數組[allCityArray addObject:dic];}return allCityArray; }//若第一個字的第一個字母相同,則按第一個字的第二個字母比較,若第一個字的字母完全相同,按第二個字的首字母繼續排序,依此類推,也可以根據自己的業務需求定制更復雜的比較邏輯 NSInteger nickNameSort(id cityFitst, id citySecond, void *context){//類型轉換CCCityModel *cityF = (CCCityModel *)cityFitst;CCCityModel *cityS = (CCCityModel *)citySecond;return? [cityF.name localizedCompare:cityS.name]; }//獲取漢字首字母 - (NSString *)firstCharactor:(NSString *)aString{//轉成了可變字符串NSMutableString *str = [NSMutableString stringWithString:aString];//先轉換為帶聲調的拼音CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);//再轉換為不帶聲調的拼音CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);//轉化為大寫拼音NSString *pinYin = [str capitalizedString];//獲取并返回首字母return [pinYin substringToIndex:1];}

通過以上方法得到一個按字母分組排序后的數組作為tableview的數據源,然后實現tableview的相關方法展示到界面上即可,這里已經沒有什么難度就不再敘說。

然后是右側索引的創建,這里使用的是DSectionIndexView,也很簡單,可參考https://www.jianshu.com/p/d4213ea7e058。

最后是上邊搜索功能,我這里是將從服務器獲取的未分組排序的數組緩存了,搜索都是操作的該數組生成新的數據源然后刷新tableview。

https://www.jianshu.com/p/69ff8ed1857f多音字處理方法

總結

以上是生活随笔為你收集整理的城市列表排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。