campare陷阱

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

    }

OC排序代码,直接上代码

//数字排序

- (void)sortNumber{

NSArray *originalArray =
@[@"8",@"41",@"32",@"11",@"-1"];

//block比較方法。数组中能够是NSInteger,CGFloat等(须要转换)

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

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

return (NSComparisonResult)NSOrderedDescending;

}else if ([string1integerValue] < [string2integerValue]){

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(0,obj1.length);

return [obj1 compare:obj2options:comparisonOptionsrange:range];

};

NSArray *resultArray2 = [charArray
sortedArrayUsingComparator:sort];

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

}

//字典排序

- (void)sortDicrionary{

NSMutableArray *array = [NSMutableArrayarrayWithObjects:

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

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

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

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

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

nil];

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

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

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

NSComparisonResult result = [number1compare:number2];

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

return result == NSOrderedDescending;//升序

}];

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

}

//自己定义对象排序

- (void)sortCustomObject{

SLPerson *person1 = [[SLPersonalloc]init];

[person1 setName:@"ABCD"];

[person1 setAge:24];

SLPerson *person2 = [[SLPersonalloc]init];

[person2 setName:@"ACBD"];

[person2 setAge:22];

SLPerson *person3 = [[SLPersonalloc]init];

[person3 setName:@"ABDC"];

[person3 setAge:33];

SLPerson *person4 = [[SLPersonalloc]init];

[person4 setName:@"ACDB"];

[person4 setAge:22];

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

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

NSSortDescriptor *sortDescriptor2 = [NSSortDescriptorsortDescriptorWithKey:@"name"ascending:YES]; 
//假设age同样,依照name排序,以此类推

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

for(NSInteger i =0; i < [tempArraycount]; i++){

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

}

}

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

Objective—C中的排序及Compare陷阱的更多相关文章

  1. Object-C中的排序和Compare陷阱

    来源:http://m.blog.csdn.net/blog/u011883764/38868097 Date : 2015-12-24 一.Compare陷阱 NSString有多个compare相 ...

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

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

  3. Java集合中对象排序

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

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

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

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

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

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

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

  7. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  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. day5模块学习--sys模块

    sys模块 sys模块是处理与系统相关的模块,sys(system),下面来看看sys模块常用的方法: 1.sys.argv         #命令行参数list,第一个元素是程序本身路径 2.sys ...

  2. 【LOJ】#2047. 「CQOI2016」伪光滑数

    题解 可持久化可并堆 用\(f[i,j]\)表示最大的质数标号为i,然后有j个质数乘起来 用\(g[i,j]\)表示\(\sum_{k = 1}^{i}f[k,j]\) 转移是 \(f[i,j] = ...

  3. 黑马程序员_java基础笔记(10)...JDK1.5的新特性

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1:静态导入.2:for—each循环.3:自动装箱/拆箱.4:可变参数.5:枚举 ...

  4. java I/O流类概述

    java I/O流类概述

  5. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  6. BoneBlack am335x can0 通讯配置与测试

    准备工具: 1.内核3.14.65,u-boot.文件系统 2.boneblack开发板 3.串口线.电源线,测试线,测试夹 一.配置内核支持CAN通讯 [*] Networking support ...

  7. [leetcode tree]100. Same Tree

    判断输入的两棵树是不是相同 判断当前root值,左子树和右子树是否相同 ####注意最后用的是 is 而不是 ==,因为最后判断p和q是不是None, 应该判断是不是同一个对象 class Solut ...

  8. Winform 串口通讯之读卡器

    老板给我的第一个硬件就是一个读卡器, 说让我做一下试试,于是从网上查了查就写了出来,相当的简单. 但是后来还有一个地磅的串口通讯,我整整搞了一天. 在窗体类的构造函数中写入 Form.CheckFor ...

  9. 单链表之一元多项式求和C++实现

    单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...

  10. BZOJ 3963 HDU3842 [WF2011]MachineWorks cdq分治 斜率优化 dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两 ...