ios数组排序

来源:互联网 发布:矩阵的奇异值定义 编辑:程序博客网 时间:2024/05/20 08:44

             在利用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 *strin sortArray){

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

  }

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

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

            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 *strin array){

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

    }

运用function排序:

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

{

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

        return (NSComparisonResult)NSOrderedDescending;

    }

    

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

        return (NSComparisonResult)NSOrderedAscending;

    }

    return (NSComparisonResult)NSOrderedSame;

}

 NSArray *array = [sortArraysortedArrayUsingFunction:customSort context:nil];

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

  NSSortDescriptor *sortDescriptor = [[NSSortDescriptoralloc]initWithKey:@"CategoryName"ascending:YES];//YES为升序,传no为降序。。           NSArray *sortDescriptors = [[NSArrayalloc]initWithObjects:&sortDescriptorcount: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 = [NSMutableArrayarrayWithArray:[_dateArraysortedArrayUsingComparator:

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

            NSComparisonResult result = [obj1.CategoryNamecompare:obj2.CategoryName                                                              options:NSCaseInsensitiveSearchrange:NSMakeRange(0,3)];

                                          

                                     switch(result)

                                          {

                                             case NSOrderedAscending:

                                                 return NSOrderedAscending;

                                             case NSOrderedDescending:

                                                 return NSOrderedDescending;

                                             case NSOrderedSame:

                                                 return NSOrderedSame;

                                             default:

                                                 return NSOrderedSame;

                                          }

                                      }] ];





0 0