最近项目中有个客户列表,需要对客户(Customer)做字典序排列且按A~Z~#分组展示。下面记录了我的实现方法(如果你有更好的方法,请不吝分享):
最终目标:
获得一个字典dic{key:value,…},
key:A~Z和#,
value:是一个数组,存储customer对象,对象按名称字典序排列。
实现步骤:
1.获取客户列表数据,进行json解析时将客户名称转拼音(且均转为大写)给Customer对象存储,解析完成得到存储Customer对象的数组customersArray;
2.对customersArray进行排序,让Customer对象以字典序排列,得到排序后的数组customersSortedArray(我这里得到的顺序是按照#~A~Z排列的);
数组的排序方法:http://beyondvincent.com/blog/2014/01/26/how-to-sort-nsarray-with-custom-objects/(这里我采用的使用selector进行排序)
3.定义一个包含26个大写字母的数组:AtoZ,定义一个可变字典dic(最终展示要用到的就是这个了)。遍历customersSortedArray,如果首字母firstLetter包含在AtoZ中,从dic中获取以键为firstLetter的数组(如数组不存在,则创建它),将客户添加到此数组中;如果首字母firstLetter不包含在AtoZ中,从dic中获取以键为’#’的数组(如数组不存在,则创建它),将客户添加到此数组中(由于早已对客户进行了字典排序,所以在这里添加到数组之后任然是字典序)。
代码实现如下:
for (int i = 0; i < [arr count]; i++)
{
Customer *cstr= arr[i];
NSString *firstLetter = [[NSString stringWithFormat:@"%c",[cstr.phonetic characterAtIndex:0]] uppercaseString];
NSString *key = [AtoZ containsObject:firstLetter] ? firstLetter : @"#";
NSMutableArray *arrStartWithKey = mDic[key];
if (!arrStartWithKey) {
arrStartWithKey = [[NSMutableArray alloc] init];
[mDic setObject:arrStartWithKey forKey:key];
[arrStartWithKey release];
}
[arrStartWithKey addObject:cstr];
}
4.将获得的数据dic展示在界面即可。
这里有点不完善的地方,就是多音字,上面在转拼音过程中,有个加强版,但也只能解决少许问题,这个比较麻烦,暂时还没有解决办法,如果你有解决办法,请分享一下,谢谢~