IOS数组按中文关键字以字母序排序

本文转载至 http://blog.csdn.net/xunyn/article/details/7882087

iosobjective cuser框架通讯

IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字转为拼音,kmyhy给出一个较易实现的方法,获取汉字的首字的首字母,如将“王”变成“W”,完整文章(传送门)。

其中他通过pinyinFirstLetter函数获取中文拼音,函数原理是:“pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。”函数代码我也贴了过来。

[cpp] view plaincopyprint?

  1. char pinyinFirstLetter(unsignedshort hanzi)
  2. {
  3. int index = hanzi - HANZI_START;
  4. if (index >= 0&& index <= HANZI_COUNT)
  5. {
  6. return firstLetterArray[index];
  7. }
  8. else
  9. {
  10. return hanzi;
  11. }
  12. }

这个方法真是用很原理的东西,解决一个巧妙问题,但也存在一个问题:不支持汉字(首字)的第二个字母的排序,据说映射的char数组会很大。这里我给出我的方法,先在CocoaTouch框架上看看有什么能用到的,在NSString有一个函数localizedCompare:,它的功能是通过自身与给定字符串的比较,返回一个本地化的比较结果,也就是说这个函数是支持汉字比较的。
    进一步localizedCompare:只是字符串与字符串的比较,我们要让NSArray数组通过按关键字为汉字字符串排序,我们继续在NSArray的SDK上下功夫,我们发现除了sortdArrayUsingDescriptors:通过NSSortDescriptor排序;还有sotedArrayUsingFunction:context:,这个函数支持我们自定义一个函数制定比较规则,返回比较结果,这样问题一下便解决了。我先把代码贴出来。

[cpp] view plaincopyprint?

  1. NSInteger nickNameSort(id user1, id user2, void *context)
  2. {
  3. User *u1,*u2;
  4. //类型转换
  5. u1 = (User*)user1;
  6. u2 = (User*)user2;
  7. return  [u1.nickName localizedCompare:u2.nickName
  8. ];

在需要比较地方,调用比较函数

[cpp] view plaincopyprint?

  1. sortArr = [arr sortedArrayUsingFunction:nickNameSort context:NULL];

需要的代码很少吧,这样做会有几方面的好处:1 支持多个汉字按字母序排序(若第一个字的第一个字母相同,则按第一个字的第二个字母比较,若第一个字的字母完全相同,按第二个字的首字母继续排序)。 2 原本可能需要保存汉字拼音的地方,现在不需要了。 3 可以通过对nickNameSortde进一步定制,完成更复杂的比较,比如先比较会员状态,在按姓名字母序完成比较。4 整体结构简单 使用的都是CocaTouch框架下的的方法。
再感叹一句,CocaTouch你真厉害!!

IOS数组按中文关键字以字母序排序

时间: 2024-09-29 16:26:12

IOS数组按中文关键字以字母序排序的相关文章

写一个函数实现数组中的元素随机乱序排序

//原生JS写一个函数实现一个shuffle方法,将数组中的元素随机乱序排序 var shuffle = function(arr){ var len,t,rand; for(var i =0;len = arr.length,i<len;i++){ rand = parseInt(Math.random()*len);//parseInt(Math.random()*(len-1-0)+1);或者rand = Math.floor(Math.random()*(len-1-0)+1);即Mat

统计一段文字中数组、中文、英文字母、空格以及其他特殊字符出现的次数

package util; public class CountStr { /** * 有一个字符串,其中包含中文字符.英文字符和数字字符,请统计和打印出各个字符的个数 * 短信发送平台,短信字数控制查询方法 */ public static void main(String[] args) { //String str = "adasf AAADFD我是中文,,>123"; //String str = "金马甲高端商品交易平台--2013全城热恋克拉钻石项目预售,1

关于数组的倒叙、降序、目录是否包含文件、中文排序等等

int main(int argc, const char * argv[]) { @autoreleasepool { /* 第1题 请将如下数据存储成字典,并将字典内容以字符串形式输出,输出:"XXX,年龄XXX岁,科目XXX,分数XXX"(将XXX替换为相应的数据). */ //        NSString *name = @"张三"; //        NSInteger age = 22; //        NSNumber  *[email pr

中文变英文字母(ios)

[_EnglishName setString:addressPerson.name]; if (CFStringTransform((__bridge CFMutableStringRef)_EnglishName, 0, kCFStringTransformMandarinLatin, NO)) { NSLog(@"Pingying: %@", _EnglishName); // wǒ shì zhōng guó rén } if (CFStringTransform((__bri

java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序

package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class Zhongwen_Shuzi_Times { public static void main(String[] args) { /* * 有一个字符串,其中包含中文字符.英文字符和数字字符,请统计和打印出各个字符的个数 */ String str="琅琊榜fengqichanglin

JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容

实现效果: 图一: 图二: 此例中输入的中文字符串"万万保重",有三个字是多音字,所以alert对话框中显示的是多种读音的组合: 如何实现? 如何实现通过拼音首字母快速查找页面内的中文内容呢? 过程原理是这样的:例如要对一些人名进行快速查找,当页面加载完成后,对所有人名建立一个索引,生成拼音首字母与姓名的对应关系:然后监听键盘事件,当用户按下键盘时,根据键值得到按下的是哪个字母,然后遍历索引中是否存在相同的拼音首字母: 这里还实现了根据字母组合来查找的功能,原理是这样的:当用户按键时,

IOS数组、字典、NSNumber 新写法—— @[]、@{}

IOS数组.字典.NSNumber 新写法—— @[].@{} //标准写法 NSNumber * number = [NSNumber numberWithInt:1]; NSArray * array = [NSArray arrayWithObjects:@"one", @"two", nil]; NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1&quo

ios:CGContextRef 渲染中文问题

1.项目中遇到drawRect来渲染中文,但是调用CGContextShowTextAtPoint方法失败,于是查了些资料整理总结一下 2.既然apple能显示中文,那么自然也是支持中文的. 查看所有字体: NSArray *fontFamilies = [UIFontfamilyNames]; for(NSString *fontFam in fontFamilies) { NSLog(@"=========%@=========",fontFam); NSArray *fontNa

【转】正则表达式 匹配中文,英文字母和数字及_的写法!同时控制长度

匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z] 数字:[0-9] 匹配中文,英文字母和数字及_: ^[\u4e00-\u9fa5_a-zA-Z0-9]+$ 同时判断输入长度:[\u4e00-\u9fa5_a-zA-Z0-9_]{4,10} ^[\w\u4E00-\u9FA5\uF900-\uFA2D]*$ 1.一个正则表达式,只含有汉字.数字.字母.下划线不能以下划线开头和结尾:^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$  其中:^