汉字字符串排序,如人名排序
2015-08-19 16:11
363 查看
在写通讯录时经常需要对人名进行 A->Z的排序,在网上已有好多demo,有朋友说使用 NSString的 localizedCompare 方法可以实现字符串比较,在通过数组的sortedArrayUsingComparator方法排序即可,小菜也做了尝试,结果未能如预期所想。
下面来讲讲小菜的做法吧:
1.准备获取汉字首字母的开源库,NSString + pinyin ,在 github 上有大把,需要请自行下载
2.使用递归对汉字字符串排序……开始吧,请看代码
//递归方法, 逐字取首字母排序
//测试代码如下
结果如下:
test[2404:103272] before :&张三
test[2404:103272] before :&李四
test[2404:103272] before :圣诞节
test[2404:103272] before :圣诞没
test[2404:103272] before :圣诞啊
test[2404:103272] before :abc
test[2404:103272] before :acb
test[2404:103272] before :abad
test[2404:103272] before :abccdf
test[2404:103272] before :测试1
test[2404:103272] before :测试11
test[2404:103272] before :测2
test[2404:103272] before :测试33
test[2404:103272] ————-
test[2404:103272] after :&李四
test[2404:103272] after :&张三
test[2404:103272] after :abad
test[2404:103272] after :abc
test[2404:103272] after :abccdf
test[2404:103272] after :acb
test[2404:103272] after :测2
test[2404:103272] after :测试1
test[2404:103272] after :测试11
test[2404:103272] after :测试33
test[2404:103272] after :圣诞啊
test[2404:103272] after :圣诞节
test[2404:103272] after :圣诞没
test[2404:103272] ————-
test[2404:103272] new —- &张三
test[2404:103272] new —- &李四
test[2404:103272] new —- abad
test[2404:103272] new —- abc
test[2404:103272] new —- abccdf
test[2404:103272] new —- acb
test[2404:103272] new —- 圣诞啊
test[2404:103272] new —- 圣诞没
test[2404:103272] new —- 圣诞节
test[2404:103272] new —- 测2
test[2404:103272] new —- 测试1
test[2404:103272] new —- 测试11
test[2404:103272] new —- 测试33
下面来讲讲小菜的做法吧:
1.准备获取汉字首字母的开源库,NSString + pinyin ,在 github 上有大把,需要请自行下载
2.使用递归对汉字字符串排序……开始吧,请看代码
//递归方法, 逐字取首字母排序
-(NSComparisonResult)compare:(NSString *)str1 string:(NSString *)str2 { NSString *ch1 = [str1 getFirstLetter]; //调用开源库获取首字母 NSString *ch2 = [str2 getFirstLetter]; //调用开源库获取首字母 NSComparisonResult result = [ch1 localizedCompare:ch2]; if (result == NSOrderedSame) //如果第一个字母是一样的,则进入递归 { if (str1.length == 1) { return NSOrderedAscending; } else if (str2.length == 1) { return NSOrderedDescending; } else { NSString *str3 = [str1 substringFromIndex:1]; NSString *str4 = [str2 substringFromIndex:1]; return [self compare:str3 string:str4]; } } else { return result; } }
//测试代码如下
``` NSArray *array = [NSArray arrayWithObjects:@"&张三",@"&李四",@"圣诞节",@"圣诞没",@"圣诞啊",@"abc",@"acb",@"abad",@"abccdf",@"测试1",@"测试11",@"测2",@"测试33", nil]; __weak typeof(self) weakSelf = self; for(NSString *string in array) { NSLog(@"before :%@",string); } NSLog(@"-------------"); NSArray *newArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [weakSelf compare:obj1 string:obj2]; }]; for (NSString *string in newArray) { NSLog(@"after :%@",string); } NSLog(@"-------------"); //测试 localizedCompare 方法是否管用 NSArray *array1 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSString *str1 = obj1; NSString *str2 = obj2; return [str1 localizedCompare:str2]; }]; for (NSString *string in array1) { NSLog(@" new ---- %@",string); }
结果如下:
test[2404:103272] before :&张三
test[2404:103272] before :&李四
test[2404:103272] before :圣诞节
test[2404:103272] before :圣诞没
test[2404:103272] before :圣诞啊
test[2404:103272] before :abc
test[2404:103272] before :acb
test[2404:103272] before :abad
test[2404:103272] before :abccdf
test[2404:103272] before :测试1
test[2404:103272] before :测试11
test[2404:103272] before :测2
test[2404:103272] before :测试33
test[2404:103272] ————-
test[2404:103272] after :&李四
test[2404:103272] after :&张三
test[2404:103272] after :abad
test[2404:103272] after :abc
test[2404:103272] after :abccdf
test[2404:103272] after :acb
test[2404:103272] after :测2
test[2404:103272] after :测试1
test[2404:103272] after :测试11
test[2404:103272] after :测试33
test[2404:103272] after :圣诞啊
test[2404:103272] after :圣诞节
test[2404:103272] after :圣诞没
test[2404:103272] ————-
test[2404:103272] new —- &张三
test[2404:103272] new —- &李四
test[2404:103272] new —- abad
test[2404:103272] new —- abc
test[2404:103272] new —- abccdf
test[2404:103272] new —- acb
test[2404:103272] new —- 圣诞啊
test[2404:103272] new —- 圣诞没
test[2404:103272] new —- 圣诞节
test[2404:103272] new —- 测2
test[2404:103272] new —- 测试1
test[2404:103272] new —- 测试11
test[2404:103272] new —- 测试33
相关文章推荐
- JavaScript 给汉字排序实例代码
- java中漢字按拼音排序
- 根据汉字首字母排序 mysql
- MySQL系列:(4)细节
- Orical 汉字排序问题
- iOS获取汉字拼音首字母的方法
- MySQL按照汉字的拼音排序
- 根据所给文档生成字典
- C语言 通讯录排序
- js 中实现 汉字按拼音排序
- 通讯录之按汉字首字母排序-java
- mysql汉字按英文字母排序
- 利用JavaScript对中文(汉字)进行排序实例详解
- 桌面支持--将excel打印到一个页面
- 打印2的n次方数字三角形
- JS时间特效最常用的三款
- 静态类
- [LeetCode] Insert Interval
- git 使用过程遇到的问题集合
- POJ 2585 Window Pains(拓扑排序·窗口覆盖)