类似微信通讯录界面的排序方法及中文转拼音的方法

最近做一个类似微信的通讯录列表,因为本人也算个新手,然后呢,就遇到点问题。难点在对昵称的排序上,顺带着也就找了找中文转拼音的方法。

废话不多说,直接贴代码吧

1、首先要对昵称字符串进行中文转拼音,这个比较简单,写到NSString分类里面就行。

- (NSString *)pinyin;
{
    NSMutableString *str = [self mutableCopy];
    CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);
      
    return [str stringByReplacingOccurrencesOfString:@" " withString:@""];//顺带去除字符串前面的空格
   
}

2、对昵称字符串数组进行分组,按a--z--#的顺序,相同首字母的保存在同一个数组中。

+ (NSMutableArray *) getNameCellArrayBy:(NSMutableArray *)array{
    NSMutableArray *ans = [[NSMutableArray alloc] init];

    NSArray *serializeArray = [(NSArray *)array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {//排序
        int i;
        NSString *strA = ((NSString *)obj1).pinyin;
        NSString *strB = ((NSString *)obj2).pinyin;
        for (i = 0; i < strA.length && i < strB.length; i ++) {
            char a = [strA characterAtIndex:i];
            char b = [strB characterAtIndex:i];
            if (a > b) {
                return (NSComparisonResult)NSOrderedDescending;//上升
            }
            else if (a < b) {
                return (NSComparisonResult)NSOrderedAscending;//下降
            }
        }

        if (strA.length > strB.length) {
            return (NSComparisonResult)NSOrderedDescending;
        }else if (strA.length < strB.length){
            return (NSComparisonResult)NSOrderedAscending;
        }else{
            return (NSComparisonResult)NSOrderedSame;
        }
    }];

    char lastC = ‘1‘;
    NSMutableArray *data;
    NSMutableArray *oth = [[NSMutableArray alloc] init];
    for (NSString *user in serializeArray) {
        char c = [user.pinyin characterAtIndex:0];
        if (!isalpha(c)) {
            [oth addObject:user];
        }
        else if (c != lastC){
            lastC = c;
            if (data && data.count > 0) {
                [ans addObject:data];
            }

            data = [[NSMutableArray alloc] init];
            [data addObject:user];
        }
        else {
            [data addObject:user];
        }
    }
    if (data && data.count > 0) {
        [ans addObject:data];
    }
    if (oth.count > 0) {
        [ans addObject:oth];
    }
    return ans;
}

3、获取排号顺序的昵称数组的首字母。

+ (NSMutableArray *)getNameSectionArrayBy:(NSMutableArray *)array{
    NSMutableArray *section = [[NSMutableArray alloc] init];
    for (NSArray *item in array) {
        NSString *user = [item objectAtIndex:0];
        char c = [user.pinyin characterAtIndex:0];
        if (!isalpha(c)) {
            c = ‘#‘;
        }
        [section addObject:[NSString stringWithFormat:@"%c", toupper(c)]];
    }
    return section;
}

完结。。。新手谨以此记录,防止以后忘记找不到了。

时间: 2024-10-05 14:46:27

类似微信通讯录界面的排序方法及中文转拼音的方法的相关文章

【cocos2dx】rapidjson使用方法以及中文显示的解决方法【续】

上一个博客讲了怎么用rapidjson读取中文字符串,但是有一个很明显的缺陷 就是不能直接读取数据编辑器导出的数据.下面我们来修复这个bug并且将代码精简到不到原来的一半大小. 上一博客的地址是:[cocos2dx]rapidjson使用方法以及中文显示的解决方法 不多说 直接上源码吧: 首先,数据编辑器导出的格式是: [{"id":1,"content":"再次按下返回键退出游戏"},{"id":2,"conten

localeCompare() 方法实现中文的拼音排序

google了很多次才发现在国外网站上有提示如何比较中文,原文地址:http://www.webdeveloper.com/forum/showthread.php?t=9365 前提:使用Unicode 编码,如果其他GBK此方法应该就不行! 定义和用法 用本地特定的顺序来比较两个字符串. stringObject.localeCompare(target) target:要以本地特定的顺序与 stringObject 进行比较的字符串 测试1: var str="北京"; var

jquery之getJSON方法获取中文数据乱码解决方法

最近公司做的东西要用到js,感觉js太繁琐,所以自己学起了jquery,发现jquery确实强大.在学到jquery ajax的时候(用的工具是eclipse),发现$.getJSON()方法请求服务器的json数据(有中文),返回到浏览器页面是乱码,怎么办呢? 原因是浏览器编码和服务器里的json数据编码不一致, 1.对着项目右键,properties,将text file encoding,改为utf-8.这时访问页面,发现还是乱码.我们还需要一步. 2.对着json文件,右键,proper

android 中文转拼音的方法

代码: /** * 中文转拼音 */ public class ChineseSpelling { private static int[] pyvalue = new int[] { -20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032, -20026, -20002, -19990, -19986, -19982, -19976, -1980

类似于微信通讯录的界面Demo

这几天遇到一个项目需要向微信通讯录那样展示联系人,这里我做了一个简单的例子,希望可以帮助大家 先来看下界面的实现效果          上面的是在搜索框搜索时的结果,和点击后边的字母跳转到相应 的字母对应名字地方,并且显示你选择的字母 好了,现在我们来整理一下思路,怎么实现这中效果呢. 第一步,我们肯定是要有一个这样的界面 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec

Android 自定义 View 实现通讯录字母索引(仿微信通讯录)

一.效果:我们看到很多软件的通讯录在右侧都有一个字母索引功能,像微信,小米通讯录,QQ,还有美团选择地区等等.这里我截了一张美团选择城市的图片来看看: 我们今天就来实现图片中右侧模块的索引功能,包括触摸显示以选中的索引字母.这里我的UI界面主要是参照微信的界面来实现,所以各位也可以对照微信来看看效果,什么都不说了,只有效果图最具有说服力! 二.分析: 我们看到这样的效果我们心理都回去琢磨,他是如何实现的: 首先,它肯定是通过自定义 View 来实现的,因为 Android 没有提供类似这样的控件

iOS开发&gt;学无止境 - AKTabBarController:类似微信的第三方库

自从有了评论之后,就可以很方便的和大家交流.以前都是我一个人默默的发文章,看不出大家对文章的看法.评论开通之后,就可以很快速的获取大家对文章的看法. 有人会指出文章里有错误的地方,真的很感激他们,非常的认真:有人会对文章说出自己的见解,加深自己的印象,同时,也能帮助到其他的朋友:有人也会在评论里,提出一些问题,但是鉴于评论的字数限制,只能简单的回答一下. 在昨天的文章评论里面,有一个朋友提出了一个问题,关于微信导航栏的. 问题分析和解答 问: 自定义导航栏怎么写?就像微信那样,tabBar的四个

Android ActionBar应用实战,高仿微信主界面的设计

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对较为深刻的理解了.唯一欠缺的是,前面我们都只是学习了理论知识而已,虽然知识点已经掌握了,但是真正投入到项目实战当中时会不会掉链子还很难说.那么不用担心,本篇文章我就将带领大家一起进入ActionBar的应用实战,将理论和实践完美结合到一起. 如果你还没有看过我的前两篇文章,建议先去阅读一下 Andr