中文通讯录排序的一种实现方法

在我们通讯录中,联系人都是按一定的顺序(字典顺序)从上到下排列的。那么对于保存为中文的联系人,它的排序是怎样实现的呢?

现行比较好理解,容易想到又通用的方法是先将中文转换为拼音形式,再根据拼音各字母的ACSII码大小比较从而实现排序目的。

1、申请两个数组A、B,A中保存的是原始联系人数据

2、将数组A中的汉字转换为拼音:
iOS在CoreFoundation中提供了CFStringTransform函数,可将汉字转换为拼音,它的定义如下:

Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);

参数说明:
string参数是要转换的string,比如要转换的中文,同时它是mutable的,因此也直接作为最终转换后的字符串。
range是要转换的范围,同时输出转换后改变的范围,如果为NULL,视为全部转换。
transform可以指定要进行什么样的转换,这里可以指定多种语言的拼写转换。
reverse指定该转换是否必须是可逆向转换的。

如果转换成功就返回true,否则返回false。

如果要进行汉字到拼音的转换,我们只需要将transform设定为
kCFStringTransformMandarinLatin或者kCFStringTransformToLatin
(kCFStringTransformToLatin也可适用于非汉字字符串)

实例如下:
CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR(“中国”));
CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
NSLog(@”%@”, string);
这段代码将输出:
2013-11-22 14:41:14.644 Test[2436:907] zhōng guó

可以看出,CFStringTransform正确的输出了“中国”的拼音,而且还带上了音标。有时候我们不需要音标怎么办?还好CFStringTransform同时提供了将音标字母转换为普通字母的方法kCFStringTransformStripDiacritics。我们在上面的代码基础上再加上这个:

CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
NSLog(@”%@”, string);

那么最终将输出:
2013-11-22 14:47:00.380 Test[2470:907] zhong guo

3、去掉拼音中的空白字符

4、将数组A中联系人的拼音形式存储到数组B中,此时A与B中索引相同的元素存储的是同一个人。在数组B中的每个元素后面都加上该元素在数组中的索引号。

5、对数组B中的所有元素进行排序(按ACSII码)。

6、显示数据时,从数组B中第一个元素开始,依次取出元素末尾的索引号,据此索引号去数组A中提取相应位置的元素将其显示出来,得到的显示结果就是排好序的数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值