iOS实现联系人按照首字母进行排序

来源:互联网 发布:java rmi 无继承 框架 编辑:程序博客网 时间:2024/05/16 07:19

联系人功能的需求一般都会有按照首字母排序,并且会要求同一个姓的就要连续起来中间不能穿插别的姓,百度了一下看到UILocalizedIndexedCollation给我们提供了很方便的排序方法,它不需要将中文转为拼音,但是有一个缺点就是如果姓氏存在多音字就无法区分(例如:姓增,它会被分配到C (ceng)组)
下面贴代码:
1,建一个类进行管理LinkManSort
.m文件
NSString *const CYPinyinGroupResultArray = @”CYPinyinGroupResultArray”;

NSString *const CYPinyinGroupCharArray = @”CYPinyinGroupCharArray”;

@implementation LinkManSort

// 按首字母分组排序数组
+(NSDictionary )sortObjectsAccordingToInitialWith:(NSArray )willSortArr SortKey:(NSString *)sortkey {

// 初始化UILocalizedIndexedCollationUILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];//得出collation索引的数量,这里是27个(26个字母和1个#)NSInteger sectionTitlesCount = [[collation sectionTitles] count];//初始化一个数组newSectionsArray用来存放最终的数据,我们最终要得到的数据模型应该形如@[@[以A开头的数据数组], @[以B开头的数据数组], @[以C开头的数据数组], ... @[以#(其它)开头的数据数组]]NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];//初始化27个空数组加入newSectionsArrayfor (NSInteger index = 0; index < sectionTitlesCount; index++) {    NSMutableArray *array = [[NSMutableArray alloc] init];    [newSectionsArray addObject:array];}NSLog(@"newSectionsArray %@ %@",newSectionsArray,collation.sectionTitles);NSMutableArray *firstChar = [NSMutableArray arrayWithCapacity:10];//将每个名字分到某个section下for (id Model in willSortArr) {    //获取name属性的值所在的位置,比如"林丹",首字母是L,在A~Z中排第11(第一位是0),sectionNumber就为11    NSInteger sectionNumber = [collation sectionForObject:Model collationStringSelector:NSSelectorFromString(sortkey)];    //把name为“林丹”的p加入newSectionsArray中的第11个数组中去    NSMutableArray *sectionNames = newSectionsArray[sectionNumber];    [sectionNames addObject:Model];//拿出每名字的首字母    NSString * str= collation.sectionTitles[sectionNumber];    [firstChar addObject:str];    NSLog(@"sectionNumbersectionNumber %ld %@",sectionNumber,str);}//返回首字母排好序的数据NSArray *firstCharResult = [self SortFirstChar:firstChar];NSLog(@"firstCharResult== %@",firstCharResult);//对每个section中的数组按照name属性排序for (NSInteger index = 0; index < sectionTitlesCount; index++) {    NSMutableArray *personArrayForSection = newSectionsArray[index];    NSArray *sortedPersonArrayForSection = [collation sortedArrayFromArray:personArrayForSection collationStringSelector:@selector(name)];    newSectionsArray[index] = sortedPersonArrayForSection;}//删除空的数组NSMutableArray *finalArr = [NSMutableArray new];for (NSInteger index = 0; index < sectionTitlesCount; index++) {    if (((NSMutableArray *)(newSectionsArray[index])).count != 0) {        [finalArr addObject:newSectionsArray[index]];    }}return @{CYPinyinGroupResultArray:finalArr,         CYPinyinGroupCharArray:firstCharResult};

}

+(NSArray )SortFirstChar:(NSArray )firstChararry{

//数组去重复NSMutableArray *noRepeat = [[NSMutableArray alloc]initWithCapacity:8];NSMutableSet *set = [[NSMutableSet alloc]initWithArray:firstChararry];[set enumerateObjectsUsingBlock:^(id obj , BOOL *stop){    [noRepeat addObject:obj];}];//字母排序NSArray *resultkArrSort1 = [noRepeat sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {    return [obj1 compare:obj2 options:NSNumericSearch];}];//把”#“放在最后一位NSMutableArray *resultkArrSort2 = [[NSMutableArray alloc]initWithArray:resultkArrSort1];if ([resultkArrSort2 containsObject:@"#"]) {    [resultkArrSort2 removeObject:@"#"];    [resultkArrSort2 addObject:@"#"];}return resultkArrSort2;

}

.h文件
先引入框架UIKit/UIKit.h
/**
* 获取model数组
*/
UIKIT_EXTERN NSString *const CYPinyinGroupResultArray;

/**
* 获取所包函字母的数组
*/
UIKIT_EXTERN NSString *const CYPinyinGroupCharArray;
@interface LinkManSort : NSObject
+(NSDictionary )sortObjectsAccordingToInitialWith:(NSArray )willSortArr SortKey:(NSString *)sortkey ;

在VC里面调用
NSArray *arr = @[@{@”name”:@”李立”},@{@”name”:@” 李安”},@{@”name”:@”刘星”},@{@”name”:@”刘小米”},@{@”name”:@”苏音”},@{@”name”:@”韦佳佳”},@{@”name”:@”李华”},@{@”name”:@”杨波”},@{@”name”:@”陈恒”},@{@”name”:@”黄呀呀”},@{@”name”:@”邱珀”},@{@”name”:@”李克”},@{@”name”:@”123456”},@{@”name”:@”韦立林”},@{@”name”:@”陈瑶”}];

NSMutableArray *marr = [NSMutableArray arrayWithCapacity:10];for (NSDictionary *dict in arr) {    PersonModel *model =[[PersonModel alloc]init];// dict[@"name"];    model.name =dict[@"name"];    [marr addObject:model];}

NSDictionary *dcit= [LinkManSort sortObjectsAccordingToInitialWith:marr SortKey:@”name”];

NSArray *resultarr1 = dcit[CYPinyinGroupResultArray];//排好顺序的PersonModel数组NSArray *resultarr2 = dcit[CYPinyinGroupCharArray];//排好顺序的首字母数组

完成

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完宝宝头发一把一把的掉怎么办 生完宝宝后头发掉的厉害怎么办 生完宝宝头发掉的厉害怎么办 生了小孩后头发掉很多怎么办 生了孩子头发掉的很厉害怎么办 母乳期头发掉的很厉害怎么办 宝宝吃母乳头发掉的厉害怎么办 头发油腻头皮屑多还掉头发怎么办 头发剪了中分刘海弯了怎么办 头发掉了长出来的头发很细怎么办? 头皮损伤毛囊怎么办还会长头发吗 一岁宝宝头发稀少怎么办能刮光头么 前编头发长了怎么办怎么梳理 九个月宝宝头发稀少不长怎么办 前牙吃饭咬合很深吃饭就痛怎么办 吃了甜的冷的就牙疼怎么办 吃热的凉的甜的牙疼怎么办 头发太细了想让头发变粗点怎么办 我的头发又少又很油该怎么办 头发油掉发头顶头发稀疏怎么办 我的头发天生就少又细怎么办 头发越来越少怎么办 用什么好呢 头发油掉头发怎么办吃什么药好 生完孩子三个月掉头发很厉害怎么办 电夹板夹头发现在掉头发怎么办 刚剪完的头发前面短后面长怎么办 头发太多太厚怎么办_百度经验 米诺地尔搽剂喷在头皮上痛怎么办 米诺地尔擦了头皮痒怎么办 头发又细又少一天不洗就油怎么办 头又尖头发又细又少不知怎么办 蘑菇头发型留长尴尬期怎么办 月经期间洗了下头量很少了怎么办 宝宝喝了有沐浴露的洗澡水怎么办 4个月宝宝头发长的慢怎么办 宝宝不小心吃了自己拉的屎怎么办 手机不小心弄成耳机模式怎么办 苹果手机不小心按了丢失模式怎么办 苹果手机不小心调成耳机模式怎么办 不小心把图书馆的书弄坏了怎么办 不小心把图书馆书拿出来了怎么办