您的位置:首页 > 其它

汉字字符串排序,如人名排序

2015-08-19 16:11 363 查看
在写通讯录时经常需要对人名进行 A->Z的排序,在网上已有好多demo,有朋友说使用 NSString的 localizedCompare 方法可以实现字符串比较,在通过数组的sortedArrayUsingComparator方法排序即可,小菜也做了尝试,结果未能如预期所想。

下面来讲讲小菜的做法吧:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息