对联系人列表进行排序
步骤:
1、将26个字母保存为一个数组 + 再保存为一个以每个字母为key的字典
//获取26个字母
for (char ch ='a'; ch<='z'; ch++)
{
//添加到key的数组
NSString *key =[NSString stringWithFormat:@"%c",ch];
//添加到数组
[self.mArrkeys addObject:key];
//创建可变的数组
NSMutableArray *mArr =[NSMutableArray new];
//把26个字母作为键值 添加可变数组对象到可变字典中
[self.mDic setObject:mArr forKey:key];
}
此时考虑到排序的数据开头字母可能为非a~z,多加一个“#”来存放其他的数据
NSMutableArray *mArr =[NSMutableArray new];
NSString *jing = @"#";
[self.mArrkeys addObject:jing];
[self.mDic setObject:mArr forKey:jing];
此时有拥有 :
1、一个数组:a~z 加“#”共27个元素;
2、一个字典:a~z 加“#”共27个元素,元素为key,每一个key还没有值。
2、循环将需要排序的数据值,以首字母作为键值,添加到字典中对应的元素(可变字典)
for (Dynamic_DetailXmlMoDel *cityName in arrData)
{
char index;
char tou = [[cityName.name substringToIndex:1]characterAtIndex:0];
NSLog(@"%c",tou);
if ( tou >='a' & tou <='z')//小写字母开头
{
index = tou;
}
else if (tou >='A' & tou <='Z')//大写字母开头,当做小写字母来进行排序
{
index = tou+32;
}
else//中文开头
{
//获取城市名称的首字母 进行分类
index = pinyinFirstLetter(([cityName.name characterAtIndex:0]));
}
//把首字母转对象
NSString *indexKey =[NSString stringWithFormat:@"%c",index];
//根据key值获取字典中的可变数组
NSMutableArray *mArr =self.mDic [indexKey];//dic[@"key"] @"key" =indexKey
//添加城市
[mArr addObject:cityName];
}
这里需要区分字母开头和中文开头,并且将大写字母开头的当做小写字母来处理(因为所拥有的key只有小写字母),这样子同一个字母开头的,不管大写小写,都会在一个分组下
3、将字典中没有值的元素删除,并且删除数组中对应这个key的元素
//判断没有城市的分类要删除
for (NSString *key in self.mDic.allKeys)
{
//获取key下的数组
NSMutableArray *mArrCity =self.mDic[key];
//判断个数小于1是空的
if (mArrCity.count<1)
{
//数组
[self.mArrkeys removeObject:key];
//字典
[self.mDic removeObjectForKey:key];
//跳过
continue;
}
}
4、OK,现在已经排序好数据
接下来就是显示数据
1、以数组的元素个数返回TableView的组数,元素内容就是组头的内容;
2、以字典中各个元素的值(可变数组)的个数返回每个分组的行数,并根据行数
indexPath.row设置对应的内容。
5、最后加个索引
//设置右侧的索引
-(NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
self.sectionIndexBackgroundColor = [UIColor clearColor];
self.sectionIndexColor = COLOR_STYLE;
return self.mArrkeys;
}
网友评论