Objective—C中的排序及Compare陷阱

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

时间: 2024-10-07 01:49:26

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

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

一.写在之前的 1.1 回顾Map阶段四大步凑 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排序和分组,默认情况下,是按照key进行排序和分组. 1.2 实验场景数据文件 在一些特定的数据文件中,不一定都是类似于WordCount单次统计这种规范的数据,比如下面这类数据,它虽然只有两列,但是却有一定的实践意义. 3 3 3 2 3 1 2 2 2 1 1 1 (1)如果按照第一列升序排列,当

Lucene 中自定义排序的实现

使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们就来看看在Lucene中如何实现自定义排序功能. Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和 ScoreDocCom

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

Java集合中对象排序

集合中的对象排序需求还是比较常见的,当然我们可以重写equals方法,循环比较:同时Java为我们提供了更易使用的APIs.当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序. Comparable接口方式 类自身实现Comparable接口,实现该接口中的compareTo方法. import java.util.A

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

1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较. 2:Comparable与Comparator but,在软件开发的世界中,任何没有代码的堆概念都是耍流氓.所以,无论我们解释的多么完美,必须show me the code: 我们首先看这样一段代码: public class Collect

java中的排序Comparable接口和Comparator接口

普通的类要实现排序,必须实现Comparable接口,并重写CompareTo()方法. package test; public class Field implements Comparable<Field> {     private String name;     private int age;     public Field() {     }     public Field(String name, int age) {         this.name = name;

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

linux内核中的sort函数,事实上跟我们所说的qsort函数非常像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 參数:  1 .待排序数组首地址 2 .数组中待排序元素数量 3 .各元素的占用空间大小 4 .指向函数的指针.用于确定排序的顺序. 当中compare函数应写为: 1 2 3 4 int c

STl中的排序算法

本文转自:STl中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy    对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted               判断一个区间是否已经排好序 partition     使得符合某个条件的元

objective C中的字符串

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *