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

联系人功能的需求一般都会有按照首字母排序,并且会要求同一个姓的就要连续起来中间不能穿插别的姓,百度了一下看到UILocalizedIndexedCollation给我们提供了很方便的排序方法,它不需要将中文转为拼音,但是有一个缺点就是如果姓氏存在多音字就无法区分(例如:姓增,它会被分配到C (ceng)组)

下面贴代码:

1,建一个类进行管理LinkManSort

.m文件

NSString *const CYPinyinGroupResultArray = @”CYPinyinGroupResultArray”;

NSString *const CYPinyinGroupCharArray = @”CYPinyinGroupCharArray”;

@implementation LinkManSort

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

// 初始化UILocalizedIndexedCollation
UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
//得出collation索引的数量,这里是27个(26个字母和1个#)
NSInteger sectionTitlesCount = [[collation sectionTitles] count];
//初始化一个数组newSectionsArray用来存放最终的数据,我们最终要得到的数据模型应该形如@[@[以A开头的数据数组], @[以B开头的数据数组], @[以C开头的数据数组], ... @[以#(其它)开头的数据数组]]
NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];
//初始化27个空数组加入newSectionsArray
for (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];//排好顺序的首字母数组

完成啦!

以上这篇iOS实现联系人按照首字母进行排序的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • IOS中获取本地通讯录联系人以及汉字首字母排序

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBooks = nil; if (DeviceVersion < 6.0) { addressBooks = ABAddressBookCreate(); } else { addressBooks = ABAddressBookCreateWithOptions(NULL, NULL); //获取通讯

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

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

  • PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法

    本文实例讲述了PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法.分享给大家供大家参考,具体如下: ICU(International Components for Unicode)里提供了transliterator(直译器), 可以很方便把其他语言(比如简体中文)转为拉丁文表示: http://cn2.php.net/manual/zh/transliterator.transliterate.php Transliterator: allows getting la

  • PHP将字符串首字母大小写转换的实例

    每个单词的首字母转换为大写:ucwords() <?php $foo = 'hello world!'; $foo = ucwords($foo); // Hello World! $bar = 'HELLO WORLD!'; $bar = ucwords($bar); // HELLO WORLD! $bar = ucwords(strtolower($bar)); // Hello World! ?> 第一个单词首字母变大写:ucfirst() <?php $foo = 'hello

  • 利用PHP获取汉字首字母并且分组排序详解

    前言 本文主要给大家介绍了关于PHP获取汉字首字母并分组排序的相关内容,因经常我们在做项目的时候,会有按首字母排序的需求 比如: 美团的城市选择 http://www.meituan.com/index/changecity/initiative app中按字母搜索 正题 网上找了各种,不尽人意,于是,自己就写了一个,分享给大家. <?php /** * @author Tech */ class Character { /** * 二维数组根据首字母分组排序 * @param array $d

  • python中合并两个文本文件并按照姓名首字母排序的例子

    前段时间前在网上看到一段面试题,要求如下: employee文件中记录了工号和姓名 复制代码 代码如下: cat employee.txt: 100 Jason Smith 200 John Doe 300 Sanjay Gupta 400 Ashok Sharma bonus文件中记录工号和工资 复制代码 代码如下: cat bonus.txt: 100 $5,000 200 $500 300 $3,000 400 $1,250 要求把两个文件合并并输出如下, 处理结果: 复制代码 代码如下:

  • PHP实现获取第一个中文首字母并进行排序的方法

    本文实例讲述了PHP实现获取第一个中文首字母并进行排序的方法.分享给大家供大家参考,具体如下: 最近在做储值结算,需求里结算首页需要按门店的首字母A-Z排序.我的数据结构原本是这样的: Array ( [0] => Array ( [sid] => 2885842 [recetcstoredpay] => 24000 [recetclprinciple] => 23465 [paytcstoredpay] => 5455 [paytclprinciple] => 349

  • php实现姓名根据首字母排序的类与方法(实例代码)

    php将名字按首字母进行排序,具体代码如下所示: <?php public function getFirstChar($s){ $s0 = mb_substr($s,0,3); //获取名字的姓 $s = iconv('UTF-8','gb2312', $s0); //将UTF-8转换成GB2312编码 //dump($s0); if (ord($s0)>128) { //汉字开头,汉字没有以U.V开头的 $asc=ord($s{0})*256+ord($s{1})-65536; if($a

  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序.这是中国人大多数使用的排序方法.那么在php程序中该如何操作呢? 下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的,这个可是经过小编实践应用过的,真的可以使用的哦. //php获取中文字符拼音首字母 function getFirstCharter($str){ if(empty($str)){return '';} $fchar=ord($str{0}); if($fchar>=ord('A'

  • js提取中文拼音首字母的封装工具类

    前言 本文主要记录了如何用js提前中文拼音首字母的方法.封装一个函数,假如有需要的,可以直接拿去用.下面话不多说了,来一起看看详细的介绍吧. 原理 主要是根据中文的unicode码来进行的.主要是在收集的中文范围内查找,大家可以多收集一些.假如中文是多音字,那可能有点坑了! var getPy = (function() { //函数使用,本表收录的字符的Unicode编码范围为19968至40869, XDesigner 整理 var strChineseFirstPY = "YDYQSXMW

随机推荐