当前位置: 首页 > news >正文

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比較方法。数组中能够是NSIntegerCGFloat等(须要转换)

    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


转载于:https://www.cnblogs.com/blfshiye/p/5391261.html

相关文章:

  • 《Struts2.x权威指南》学习笔记2
  • 【作业3】关于C语言的问卷调查
  • 控制台手动编译Qt5程序
  • 创建NetWorkDataset---Shapefile篇
  • 获取验证码按钮点击后,一分钟内不可继续点击
  • Delphi Canvas的FillRect(const Rect: TRect) 函数的作用
  • B+/-Tree原理及mysql的索引分析
  • 关闭Rootless机制
  • 图像缩放算法
  • Effective C++笔记(三):资源管理
  • IOS开发之远程推送
  • Set的用法
  • 安卓手持智能POS端上能扫描开单的软件-店面销售开单系统
  • 等式 hash
  • ARDUINO W5100 WebClient 测试
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 77. Combinations
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • C++类中的特殊成员函数
  • MySQL的数据类型
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • web标准化(下)
  • Web设计流程优化:网页效果图设计新思路
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 计算机常识 - 收藏集 - 掘金
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 聊聊sentinel的DegradeSlot
  • 全栈开发——Linux
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用 Docker 部署 Spring Boot项目
  • 赢得Docker挑战最佳实践
  • 鱼骨图 - 如何绘制?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #FPGA(基础知识)
  • (175)FPGA门控时钟技术
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (function(){})()的分步解析
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读40-45)图像描述1
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *2 echo、printf、mkdir命令的应用
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET大文件上传知识整理