来源:http://m.blog.csdn.net/blog/u011883764/38868097

Date : 2015-12-24

一.Compare陷阱

NSString有多个compare相关方法:
- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale;

NSComparisonResult 是定义的一个枚举,定义如下:
typedef NS_ENUM(NSInteger, NSComparisonResult) {

  NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending

};
其中,NSOrderedSame 表示比较的两个字符串完全一致, 同时,在这个枚举中,它的值是 0.
字符串比较在程序中很常见,比如:

if ([str1 compare:@"some text"] == NSOrderedSame) {
// TODO
}
else {
// TODO
}

但是,如果如上中的str1为nil,根据Objective-C的消息调用规则(方法调用),对nil发送的任何消息,得到的返回都是nil。这样的情况下,运行时是不会像C/C++那样,出现空指针的非法访问而使得程序强行终止。也就是说,在Objective-C下面,即便str1为nil,也不会造成程序崩溃,而是会继续运行。
那么当str1为空的时候,[str1 compare:@"some text"] 消息的返回就会为nil。nil表示一个空的Objective-C对象,实际就是表示一个空指针,而它代表的值就是0,与NSOrderedSame的值相等. 如此,回到最前面的if语句,如果str1为nil,那么整个语句的值为真。这会给程序造成非常严重的问题,小则逻辑错误,UI显示错误等,大则会造成数据泄漏等等。。。所以,一旦出现这种情况,还是很严重的。
笔者个人建议,以上代码至少应该写为:

 if (str1!=nil && [str1 compare:@"some text"] == NSOrderedSame) {
// TODO } else {
// TODO
}

二.排序

数字排序

//数字排序

- (void)sortNumber{

    NSArray *originalArray = @[@"",@"",@"",@"",@"-1"];

    //block比较方法,数组中可以是NSInteger,CGFloat等(需要转换)

    NSComparator finderSort = ^(id string1,id string2){

        if ([string1 integerValue] > [string2 integerValue]) {

            return (NSComparisonResult)NSOrderedDescending;

        }else if ([string1 integerValue] < [string2 integerValue]){

            return (NSComparisonResult)NSOrderedAscending;

        }

        else

            return (NSComparisonResult)NSOrderedSame;

    };

    NSArray *resultArray = [originalArray sortedArrayUsingComparator:finderSort];

    NSLog(@"排序结果:%@",resultArray);

}

字符串排序

//字符串排序

- (void)sortString{

    //  2. 非数字型字符串(注意用compare比较要剔除空数据(nil))

    NSArray *charArray =@[@"string 1",@"String 21",@"string 12",@"String 11",@"String 02"];

    NSStringCompareOptions comparisonOptions =NSCaseInsensitiveSearch|NSNumericSearch|

    NSWidthInsensitiveSearch|NSForcedOrderingSearch;

    NSComparator sort = ^(NSString *obj1,NSString *obj2){

        NSRange range = NSMakeRange(,obj1.length);

        return [obj1 compare:obj2 options:comparisonOptions range:range];

    };

    NSArray *resultArray2 = [charArray sortedArrayUsingComparator:sort];

    NSLog(@"字符串排序%@",resultArray2);

}

字典排序

//字典排序

- (void)sortDicrionary{

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:

                              @{@"obj0":@""},

                              @{@"obj3":@""},

                              @{@"obj1":@""},

                              @{@"obj2":@""},

                              @{@"obj4":@""},

                              nil];

    NSArray *resultArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {

       NSNumber *number1 = [[obj1 allKeys] objectAtIndex:];

       NSNumber *number2 = [[obj2 allKeys] objectAtIndex:];

       NSComparisonResult result = [number1 compare:number2];

       //return result == NSOrderedAscending;  //降序

       return result == NSOrderedDescending;//升序

    }];

    NSLog(@"OrderedDescending:%@", resultArray);

}

自定义对象排序

//自定义对象排序

- (void)sortCustomObject{

    SLPerson *person1 = [[SLPerson alloc] init];

    [person1 setName:@"ABCD"];

    [person1 setAge:];

    SLPerson *person2 = [[SLPersonalloc]init];

    [person2 setName:@"ACBD"];

    [person2 setAge:];

    SLPerson *person3 = [[SLPerson alloc] init];

    [person3 setName:@"ABDC"];

    [person3 setAge:];

    SLPerson *person4 = [[SLPerson alloc] init];

    [person4 setName:@"ACDB"];

    [person4 setAge:];

    NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person3, person4, person2, nil];

    NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];  //先按照age排序,

    NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];  //如果age相同,按照name排序,以此类推

    NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil]];

    for(NSInteger i =; i < [tempArray count]; i++){

        NSLog(@"%@--------%d\n", [[tempArray objectAtIndex:i] name], [[tempArray objectAtIndex:i] age]);

    }
}

代码链接:http://download.csdn.net/detail/u011883764/7827311

Object-C中的排序和Compare陷阱的更多相关文章

  1. Objective—C中的排序及Compare陷阱

    campare陷阱 NSString有多个compare相关方法: - (NSComparisonResult)compare:(NSString *)string; - (NSComparisonR ...

  2. Hadoop学习笔记—11.MapReduce中的排序和分组

    一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...

  3. Java集合中对象排序

    集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...

  4. Comparable与Comparator,java中的排序与比较

    1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...

  5. C# winform中listview排序

    本文解决方案是采用下面链接中的解决方案.十分感谢这篇文章的作者bright:http://blog.163.com/shensc@126/blog/static/1312896522010614103 ...

  6. linux内核中的排序接口--sort函数

    linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...

  7. .Net中集合排序的一种高级玩法

    背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...

  8. STL中的排序算法

    本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...

  9. C++中的排序

    下面网站解释比较好 http://www.cnblogs.com/heyonggang/archive/2013/11/03/3404371.html 1. qsort(C中的函数加上stdlib.h ...

随机推荐

  1. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  2. PHP中Array关于数组的用法

    使用函数array_keys(),得到数组中所有的键,参数:数组 $arr=array();$arr['one']="one";$arr['two']="two" ...

  3. jquery+thinkphp实现跨域抓取数据的方法

    jquery的$.post发送数据到服务器后台,在由后台的PHP代码执行远程抓取,存到数据库ajax返回数据到前台,前台用JS接受数据并显示. //远程抓取获取数据$("#update_ac ...

  4. Python精神

    [root@LDAP_slave ~]# python -c "import this" The Zen of Python, by Tim Peters Beautiful is ...

  5. ecshop的几个小瑕疵

    在安装Ecshop的时候,遇到两个问题: 1.Strict Standards: Non-static method cls_image::gd_version() should not be cal ...

  6. html 和 html5(一)(表格 | 列表 | 提交按钮 | 单选 |复选 | 框架 | 脚本 | html字符实体 )

    一.框架 使用iframe来显示目录链接页面 iframe可以显示一个目标链接的页面 目标链接的属性必须使用iframe的属性,如下实例: 实例 <iframe src="demo_i ...

  7. css缩写

    颜色: 16进制的色彩值为六位数,如果每两位的值相同,可以缩写一半. 如:#000000=#000: #223344=#234: 盒子的尺寸: 如margin:value; 一个值表示所有边,两个值表 ...

  8. 线程和进程详解(以java为例具体说明)

    详细参见http://ifeve.com/java-concurrency-thread-directory/ 一.线程概述 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早 ...

  9. java下载安装,环境变量,hello world

    1.Java下载安装 网址:http://java.sun.com/javase/downloads/index.jsp win7 64位选择jdk-8u11-windows-x64.exe. 2.环 ...

  10. 人活着系列之平方数 分类: sdutOJ 2015-06-22 17:10 7人阅读 评论(0) 收藏

    人活着系列之平方数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 偶然和必然?命运与意志?生与死?理性与情感?价值与非价值?在&quo ...