ios数组排序

本文介绍在iOS开发中如何使用不同的方法对数组数据进行排序,包括block、function和descriptor排序方式,以及如何结合字符串比较方法实现更复杂的排序需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

             在利用tableview显示列表数据时,经常会要将数据源排序,往往我们的数据源都是一个数组,那么我们只需要将数据排序就好了,NSArray提供了很多种方法,按照所利用的排序参数,可以简单分为descriptor,selector,function,和block排序

    NSArray *sortArray = [[NSArray allocinitWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; 

         运用 block排序:

  for(NSString *str in sortArray){

         NSLog(@"排序前:%@",str);

  }

   NSComparator cmptr = ^(id obj1, id obj2){

      if ([obj1 integerValue] > [obj2 integerValue]) {

            return (NSComparisonResult)NSOrderedAscending;

//          return (NSComparisonResult)NSOrderedDescending;

        }

        if ([obj1 integerValue] < [obj2 integerValue]) {

//            return (NSComparisonResult)NSOrderedAscending;

             return (NSComparisonResult)NSOrderedDescending;

        }

        return (NSComparisonResult)NSOrderedSame;

    };

    NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];

    for(NSString *str in array){

        NSLog(@"排序后:%@",str);

    }

运用function排序:

NSInteger customSort (id obj1, id obj2, void* context)

{

    if ([obj1 integerValue] > [obj2 integerValue]) {

        return (NSComparisonResult)NSOrderedDescending;

    }

    

    if ([obj1 integerValue] < [obj2 integerValue]) {

        return (NSComparisonResult)NSOrderedAscending;

    }

    return (NSComparisonResult)NSOrderedSame;

}

 NSArray *array = [sortArray sortedArrayUsingFunction:customSort  context:nil];

运用descriptor 排序:
这种方法排序一般是数组中存的是对象,我们要根据对象的某个属性进行排序。

  NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"CategoryName" ascending:YES];//YES为升序,传no为降序。。           NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:&sortDescriptor count:1];

 [_dateArray sortUsingDescriptors:sortDescriptors];



还可以结合运用字符串的比较方法,也可以达到排序的效果。

[value compare:(NSString *)];

[value compare:(NSString *) options:(NSStringCompareOptions)];

[value compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];


options:(NSStringCompareOptions)

传入 NSStringCompareOptions 枚举的值

enum{

    NSCaseInsensitiveSearch = 1,//不区分大小写比较

    NSLiteralSearch = 2,//区分大小写比较

    NSBackwardsSearch = 4,//从字符串末尾开始搜索

    NSAnchoredSearch = 8,//搜索限制范围的字符串

    NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt

//以下定义高于 mac os 10.5 或者高于 iphone 2.0 可用

    ,

    NSDiacriticInsensitiveSearch = 128,//忽略 "-" 符号的比较

    NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果

    NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending

//以下定义高于 iphone 3.2 可用

    ,

    NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:..., stringByReplacingOccurrencesOfString:...和 replaceOccurrencesOfString:... 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch

}


range:(NSRange)

比较字符串的范围

 结构变量:

location: 需要比较的字串起始位置(以0为起始)

length: 需要比较的字串长度

 

返回值:

typedef enum _NSComparisonResult {
              NSOrderedAscending = -1   // < 升序
              NSOrderedSame,              // = 等于
             NSOrderedDescending   // > 降序
        } NSComparisonResult;



 _dateArray = [NSMutableArray arrayWithArray:[_dateArray sortedArrayUsingComparator:

                         ^NSComparisonResult(collectCategory *obj1, collectCategory *obj2) {

            NSComparisonResult result = [obj1.CategoryName compare:obj2.CategoryName                                                              options:NSCaseInsensitiveSearch range:NSMakeRange(0,3)];

                                          

                                     switch(result)

                                          {

                                              case NSOrderedAscending:

                                                  return NSOrderedAscending;

                                              case NSOrderedDescending:

                                                  return NSOrderedDescending;

                                              case NSOrderedSame:

                                                  return NSOrderedSame;

                                              default:

                                                  return NSOrderedSame;

                                          }

                                      }] ];





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值