数组排序中NSSortOptions两个参数详解(NSSortConcurrent、NSSortStable)


         我们在进行数组排序的时候,很多时候可以根据参数理解意思,并且给定自己要传递的参数。在OC中数组排序的时候,其它方法都有对应的解释,但是唯独

    “-sortedArrayWithOptions:usingComparator:这个方法的参数没有解释清楚,网上其它博客和技术文章都给出了一些“正序”、“稳定”、“并发”的错误解释,我研究一段时间,在此给出较为正确地解释 ,下面先给大家一个例子,来让大家看一下使用场景。
     

    NSArray *array = [NSArray arrayWithObjects:@"123",@"21",@"33",@"69",@"108",@"256", nil];
    NSArray *resultArray = [array sortedArrayWithOptions:NSSortConcurrent usingComparator:^NSComparisonResult(id obj1, id obj2) {
        int nu1 = [obj1 intValue];
        int nu2 = [obj2 intValue];
        if (nu1 > nu2) {
            return NSOrderedDescending;
        }else if (nu1 == nu2){
            return NSOrderedSame;
        }else{
            return NSOrderedAscending;
        }
    }];
    NSLog(@"%@",resultArray);


 

   上面的例子中,我们使用了给定的排序方法,这个时候我们能正确地排列数组,如果我们不写“int nu1 = [obj1 intValue]和int nu2 = [obj2 intValue]”排序出来的结果不是按照大小,而是按照ASCII码表排序,这个大家都能理解。然后我们试着把方法中的Options参数改变一下,讲NSSortConcurrent换成,NSSortStable。发现结果是一样的,那么我们来甄别一下到底有什么区别。


      当然,代码熟练的同学可以直接使用下面这种方式来进行比较,结果和作用是一样的。

    NSMutableArray *array = [@[@1,@3,@9,@4,@2]mutableCopy];
    
    [array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
     
        return [obj1 compare:obj2];
        
    }];
    
    NSLog(@"%@",array);


   首先concurrent,是“并发的,一致的,同时发生的”,stable,是“稳定的”。那意思就是前者的算法比后者执行速度快,后者比前者执行的方法更稳定?我们参阅一下说明来解决一下问题,先给大家说一下概念性的区别。    我们知道后面使用的是一个Block,Block是代码块。 如果我们的参数选择的是NSSortConcurrent,那么我们的代码块用的是并行排序操作,这个选项仅仅是一个提示,并且可能在某些情况下地实现会被忽略。对NSSortConcurrent的并发操作,必须保证代码的安全调用。如果我们的参数选择的是NSSortStable,指定的排序结果应该返回的比较项,是对初值(这里指顺序)进行了改变。
   懵了么?好了亲,其实就是并行和串行的排序。并行就是多线程的排序方式,串行就是单步执行,没有多线程。如果你还没学多线程,那么简单解释起来就是两个顺序结构的语句同时执行,并行的话,有可能出现还没排好顺序,你就使用数组的情况,而且为了安全性还不一定执行这个多线程。如果你学了多线程,那就是说,排序的时候在子线程操作,所以可能出现的情况就是子线程还没执行完,主线程执行好了,那你用数组的时候...你懂。所以我们一般情况下应该使用的是NSSortStabel,就是没有特殊操作的排序,对原始数据操作之后返回排序好的结果。
   现在我们明白了,两者并不会影响排序中是按照正序还是反序排,只影响效率和稳定性,我们根据自己的取舍就OK,我建议使用NSSortStable,除非计算偏大量的时候我们采用NSSortConcurrent。     

enum{ NSSortConcurrent=(1UL<<0),   NSSortStable=(1UL<<4), };

是不是还有朋友觉得这个枚举格式很奇怪,那我们就说一下,首先UL是无符号长整型的标志(unsigned long),<<和>>都是位运算,<<是左移运算符,是将原数的各位二进制位左移对应的操作数位数,操作数就是后面的数。其实理解起来也不难,就是写成二进制,根据箭头方向移动值,缺位补零。至于具体的使用,到UI的开发阶段大家会频繁接触类似的枚举,理解起来也更为的方便。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值