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
Objective—C中的排序及Compare陷阱的更多相关文章
- Object-C中的排序和Compare陷阱
来源:http://m.blog.csdn.net/blog/u011883764/38868097 Date : 2015-12-24 一.Compare陷阱 NSString有多个compare相 ...
- Hadoop学习笔记—11.MapReduce中的排序和分组
一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...
- Java集合中对象排序
集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
- linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...
- .Net中集合排序的一种高级玩法
背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
- STL中的排序算法
本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...
- C++中的排序
下面网站解释比较好 http://www.cnblogs.com/heyonggang/archive/2013/11/03/3404371.html 1. qsort(C中的函数加上stdlib.h ...
随机推荐
- python3与mysql交互:pymysql
python3与mysql交互 1.安装pymysql模块 pip3 install pymysql3 2.pymysql的简单使用: # /usr/bin/env python3 import py ...
- Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决
能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...
- CSUOJ 2031 Barareh on Fire
Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...
- 浅谈 Java 中的枚举
枚举也就是一一列举,常用来表示那些可以明确范围的集合,比方说性别,季节,星期,月份等. 在 JDK 1.5 才出现枚举类,在没有出现枚举类之前,我们要表示几个确定的值通常会使用常量来表示,形如 pub ...
- JavaScript 网页脚本语言 由浅入深 (随笔)
1)基础 学习目的: 1. 客户端表单验证 2. 页面动态效果 3. jQuery的基础 什么是JavaScript? 一种描述性语言,也是一种基于对象和事件驱动的,并具有安全性能的脚本语言 java ...
- 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]
请尊重原贴作者 与 本贴楼主.原作者把自己丰富的经验分享给了大家,本贴作者每个贴子平均花了3个小时翻译. 所以,转载请注明出处:原贴地址:http://www.tonymacx86.com/ ...
- 1020 Tree Traversals (25)(25 point(s))
problem Suppose that all the keys in a binary tree are distinct positive integers. Given the postord ...
- luoguP3359 改造异或树 线段树合并
删边转化为加边 然后每次用线段树合并就行..... 确确实实很简单 然而为什么线段树合并跑不过$splay$的启发式合并,常数稍大了点... 复杂度$O(n \log n)$ #include < ...
- [Luogu5161]WD与数列(后缀数组/后缀自动机+线段树合并)
https://blog.csdn.net/WAautomaton/article/details/85057257 解法一:后缀数组 显然将原数组差分后答案就是所有不相交不相邻重复子串个数+n*(n ...
- 重庆市队选拔 CQOI2015 解题报告
文章链接:http://www.cnblogs.com/Asm-Definer/p/4434601.html 题目链接:http://pan.baidu.com/s/1mgxIKli 官方数据:htt ...