文档章节

iOS通讯录联系人列表较完整(中文排序)

BruceYu的博客
 BruceYu的博客
发布于 2014/03/04 16:33
字数 730
阅读 29899
收藏 13

代码已上传GitHub https://github.com/6357/YUChineseSorting.git

参考http://www.cnblogs.com/syxchina/archive/2012/10/11/2720257.html

一、需要导入头文件pinyin.h这里有下载地址http://download.csdn.net/detail/u013873967/6991579

这是我写的完整代码,欢迎大家学习交流,帮我改进。http://download.csdn.net/detail/u013873967/6992825

二、ChineseString.h

#import <Foundation/Foundation.h>
#import "pinyin.h"

@interface ChineseString : NSObject
@property(strong,nonatomic)NSString *string;
@property(strong,nonatomic)NSString *pinYin;

//-----  返回tableview右方indexArray
+(NSMutableArray*)IndexArray:(NSArray*)stringArr;

//-----  返回联系人
+(NSMutableArray*)LetterSortArray:(NSArray*)stringArr;

///----------------------
//返回一组字母排序数组(中英混排)
+(NSMutableArray*)SortArray:(NSArray*)stringArr;

@end

三、ChineseString.cpp

#import "ChineseString.h"

@implementation ChineseString
@synthesize string;
@synthesize pinYin;

#pragma mark - 返回tableview右方 indexArray
+(NSMutableArray*)IndexArray:(NSArray*)stringArr
{
    NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr];
    NSMutableArray *A_Result = [NSMutableArray array];
    NSString *tempString ;
    
    for (NSString* object in tempArray)
    {
        NSString *pinyin = [((ChineseString*)object).pinYin substringToIndex:1];
        //不同
        if(![tempString isEqualToString:pinyin])
        {
            // NSLog(@"IndexArray----->%@",pinyin);
            [A_Result addObject:pinyin];
            tempString = pinyin;
        }
    }
    return A_Result;
}

#pragma mark - 返回联系人
+(NSMutableArray*)LetterSortArray:(NSArray*)stringArr
{
    NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr];
    NSMutableArray *LetterResult = [NSMutableArray array];
    NSMutableArray *item = [NSMutableArray array];
    NSString *tempString;
    //拼音分组
    for (NSString* object in tempArray) {
        
        NSString *pinyin = [((ChineseString*)object).pinYin substringToIndex:1];
        NSString *string = ((ChineseString*)object).string;
        //不同
        if(![tempString isEqualToString:pinyin])
        {
            //分组
            item = [NSMutableArray array];
            [item  addObject:string];
            [LetterResult addObject:item];
            //遍历
            tempString = pinyin;
        }else//相同
        {
            [item  addObject:string];
        }
    }
    return LetterResult;
}


///////////////////
//
//返回排序好的字符拼音
//
///////////////////
+(NSMutableArray*)ReturnSortChineseArrar:(NSArray*)stringArr
{
    //获取字符串中文字的拼音首字母并与字符串共同存放
    NSMutableArray *chineseStringsArray=[NSMutableArray array];
    for(int i=0;i<[stringArr count];i++)
    {
        ChineseString *chineseString = [[ChineseString alloc]init];
        chineseString.string = [NSString stringWithString:[stringArr objectAtIndex:i]];
        if(chineseString.string == nil){
            chineseString.string = @"";
        }
        //去除两端空格和回车
        chineseString.string  = [chineseString.string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        
        
        //此方法存在一些问题 有些字符过滤不了
        //NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、[]{}#%-*+=_\\|~<>$€^•'@#$%^&*()_+'\""];
        //chineseString.string = [chineseString.string stringByTrimmingCharactersInSet:set];
        
        
        //这里我自己写了一个递归过滤指定字符串   RemoveSpecialCharacter
        chineseString.string = [ChineseString RemoveSpecialCharacter:chineseString.string];
        // NSLog(@"string====%@",chineseString.string);
        
        
        //判断首字符是否为字母
        NSString *regex = @"[A-Za-z]+";
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
        NSString *initialStr = [chineseString.string length]?[chineseString.string substringToIndex:1]:@"";
        if ([predicate evaluateWithObject:initialStr])
        {
            NSLog(@"chineseString.string== %@",chineseString.string);
            //首字母大写
            chineseString.pinYin = [chineseString.string capitalizedString] ;
        }else{
            if(![chineseString.string isEqualToString:@""]){
                NSString *pinYinResult = [NSString string];
                for(int j=0;j<chineseString.string.length;j++){
                    NSString *singlePinyinLetter = [[NSString stringWithFormat:@"%c",
                                                   
                                                   pinyinFirstLetter([chineseString.string characterAtIndex:j])]uppercaseString];
                    //                    NSLog(@"singlePinyinLetter ==%@",singlePinyinLetter);
                    
                    pinYinResult = [pinYinResult stringByAppendingString:singlePinyinLetter];
                }
                chineseString.pinYin = pinYinResult;
            }else{
                chineseString.pinYin = @"";
            }
        }
        [chineseStringsArray addObject:chineseString];
    }
    //按照拼音首字母对这些Strings进行排序
    NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"pinYin" ascending:YES]];
    [chineseStringsArray sortUsingDescriptors:sortDescriptors];
    
//    for(int i=0;i<[chineseStringsArray count];i++){
//        NSLog(@"chineseStringsArray====%@",((ChineseString*)[chineseStringsArray objectAtIndex:i]).pinYin);
//    }
    NSLog(@"-----------------------------");
    return chineseStringsArray;
}


#pragma mark - 返回一组字母排序数组
+(NSMutableArray*)SortArray:(NSArray*)stringArr
{
    NSMutableArray *tempArray = [self ReturnSortChineseArrar:stringArr];

    //把排序好的内容从ChineseString类中提取出来
    NSMutableArray *result = [NSMutableArray array];
    for(int i=0;i<[stringArr count];i++){
        [result addObject:((ChineseString*)[tempArray objectAtIndex:i]).string];
        NSLog(@"SortArray----->%@",((ChineseString*)[tempArray objectAtIndex:i]).string);
    }
    return result;
}


//过滤指定字符串   里面的指定字符根据自己的需要添加 过滤特殊字符
+(NSString*)RemoveSpecialCharacter: (NSString *)str {
    NSRange urgentRange = [str rangeOfCharacterFromSet: [NSCharacterSet characterSetWithCharactersInString: @",.?、 ~¥#&<>《》()[]{}【】^@/£¤|§¨「」『』¢¬ ̄~@#&*()——+|《》$_€"]];
    if (urgentRange.location != NSNotFound)
    {
        return [self RemoveSpecialCharacter:[str stringByReplacingCharactersInRange:urgentRange withString:@""]];
    }
    return str;
}

四、UITableViewController.cpp

- (void)viewDidLoad
{
    self.title = @"我的好友";
    [super viewDidLoad];
    
    NSArray *stringsToSort=[NSArray arrayWithObjects:
                            @"¥hhh, .$",@" ¥Chin ese ",@"开源中国 ",@"www.oschina.net",
                            @"开源技术",@"社区",@"开发者",@"传播",
                            @"2013",@"100",@"中国",@"暑假作业",
                            @"键盘", @"鼠标",@"hello",@"world",
                            nil];

    self.indexArray = [ChineseString IndexArray:stringsToSort];
    self.letterResultArr = [ChineseString LetterSortArray:stringsToSort];
}

Log


© 著作权归作者所有

BruceYu的博客

BruceYu的博客

粉丝 18
博文 59
码字总数 23494
作品 7
东城
高级程序员
私信 提问
加载中

评论(21)

杜里特

引用来自“lihanfei”的评论

你好 怎么样吧东西添加在tableview上面呢
😆
一夜飞度
哥们,多音字你没有判断,比如“长安”
l
lihanfei
你好 怎么样吧东西添加在tableview上面呢
川口人
川口人

引用来自“Heisenbean”的评论

导入我的项目中出现22个错误,能不能有个您的邮箱,我好给你下详细错误信息

引用来自“c6357”的评论

你好 我的邮箱 c6357@outlook.com 希望能帮助到你 代码已上传GitHub https://github.com/6357/YUChineseSorting.git

引用来自“Heisenbean”的评论

感谢!我已经解决了这个问题~
怎么解决的 我也是同样的问题
触不到的梦梦梦

引用来自“WUjincheng”的评论

pch文件这样子的:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#endif

引用来自“触不到的梦梦梦”的评论

你好 请问我的pch是这样的 添加了之后还是报错,怎么弄啊 多谢多谢 #ifndef _PrefixHeader_pch #define _PrefixHeader_pch #import #import "Public.h" //#import "MSViewTag.h" #import "Header.h" #endif

引用来自“c6357”的评论

#ifndef _PrefixHeader_pch #define _PrefixHeader_pch #ifdef __OBJC__ #import #import "Public.h" //#import "MSViewTag.h" #import "Header.h" #endif #endif 这么改
还是不行,我添加了之后还是会报错的。您方便加我qq么1741952968,谢谢谢谢
BruceYu的博客
BruceYu的博客

引用来自“WUjincheng”的评论

pch文件这样子的:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#endif

引用来自“触不到的梦梦梦”的评论

你好 请问我的pch是这样的 添加了之后还是报错,怎么弄啊 多谢多谢 #ifndef _PrefixHeader_pch #define _PrefixHeader_pch #import #import "Public.h" //#import "MSViewTag.h" #import "Header.h" #endif
#ifndef _PrefixHeader_pch #define _PrefixHeader_pch #ifdef __OBJC__ #import #import "Public.h" //#import "MSViewTag.h" #import "Header.h" #endif #endif 这么改
触不到的梦梦梦

引用来自“WUjincheng”的评论

pch文件这样子的:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#endif
你好 请问我的pch是这样的 添加了之后还是报错,怎么弄啊 多谢多谢 #ifndef _PrefixHeader_pch #define _PrefixHeader_pch #import #import "Public.h" //#import "MSViewTag.h" #import "Header.h" #endif
W
WUjincheng
pch文件这样子的:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#endif
W
WUjincheng
大哥们,怎么我的工程里面添加.c文件时,很多报错,似乎与 <UIKit/UIKit.h> ,<Foundation/Foundation.h>这两个有冲突
1./Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk/System/Library/Frameworks/CoreLocation.framework/Headers/CLErrorDomain.h:10:9: Could not build module 'Foundation'
2.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:397:1: Expected identifier or '('
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:399:19: Unknown type name 'NSString'

Heisenbean
Heisenbean

引用来自“Heisenbean”的评论

导入我的项目中出现22个错误,能不能有个您的邮箱,我好给你下详细错误信息

引用来自“c6357”的评论

你好 我的邮箱 c6357@outlook.com 希望能帮助到你 代码已上传GitHub https://github.com/6357/YUChineseSorting.git
感谢!我已经解决了这个问题~
解决 iOS 内英文系统中联系人排序问题

好多人喜欢将 iOS 设置为英文系统,但是有一个问题其实蛮头疼的,就是联系人的排序问题。在英文系统中,所有中文名字被默认排到了 # 后面,而不是按照拼音来分栏的。 网上有一个方法就是将每...

xh4n3
2015/07/26
0
0
苹果开放 iOS 6 正式版下载,抢先升级体验

今天凌晨,苹果正式放出了iOS 6的下载,升级还是不升级,就看你的了。中意越狱的同学,记得使用TinyUmbrella 备份SHSH。 iOS 6兼容支持iPhone 3GS,iPhone 4,iPhone 4S,iPad 3,iPad 2以及...

oschina
2012/09/20
1K
12
iOS通讯录联系人列表的实现--YUChineseSorting

pod 'YUChineseSorting', '~> 1.0.1' -> YUChineseSorting (1.0.1) iOS通讯录联系人列表较完整(中文排序) pod 'YUChineseSorting', '~> 1.0.0' - Homepage: https://github.com/c6357/YUChi......

BruceYu的博客
2016/04/19
484
0
发福利:整理了一份关于“资源汇总”的汇总

觉得有用的话,可以去github关注:https://github.com/justjavac/awesome-awesomeness-zh_CN 通用 free-programming-books-zh_CN 免费的计算机编程类中文书籍 精彩博客集合 hacke2/hacke2.gi...

justjavac
2014/11/13
500
1
IOS数组按中文关键字以字母序排序

IOS项目中会用到对通讯录的联系人或是会员按姓名为关键字排序,因为NSArray并不直接支持对汉字的排序,这就要通过将汉字转换成拼音完成按A~Z的排序,这看起来是个头疼的问题,因为牵扯到汉字...

长平狐
2012/11/01
575
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider
28分钟前
1
0
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤
32分钟前
2
0
关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区
40分钟前
3
0
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg
46分钟前
49
0
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool
55分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部