现在的位置: 首页 > 综合 > 正文

NSArray 排序汇总

2018年01月08日 ⁄ 综合 ⁄ 共 5377字 ⁄ 字号 评论关闭

IOS几种简单有效的数组排序方法

//第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象

[plain] view
plain
copy

  1. NSComparator cmptr = ^(id obj1, id obj2){  
  2.  if ([obj1 integerValue] > [obj2 integerValue]) {  
  3.         return (NSComparisonResult)NSOrderedDescending;  
  4.     }  
  5.    
  6.     if ([obj1 integerValue] < [obj2 integerValue]) {  
  7.         return (NSComparisonResult)NSOrderedAscending;  
  8.     }  
  9.     return (NSComparisonResult)NSOrderedSame;  
  10. };  
  11. NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];  
  12.  //排序前  
  13.  NSMutableString *outputBefore = [[NSMutableString alloc] init];  
  14.  for(NSString *str in sortArray){  
  15.   [outputBefore appendFormat:@"];  
  16.  }  
  17.  NSLog(@"排序前:%@",outputBefore);  
  18.  [outputBefore release];  
  19.  //第一种排序  
  20.  NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];  
  21.    
  22.  NSMutableString *outputAfter = [[NSMutableString alloc] init];  
  23.  for(NSString *str in array){  
  24.   [outputAfter appendFormat:@"];  
  25.  }  
  26.  NSLog(@"排序后:%@",outputAfter);  
  27.  [outputAfter release];  

第二种 排序方法 利用sortedArrayUsingFunction 调用 对应方法customSort,这个方法中的obj1和obj2分别是指数组中的对象。

[plain] view
plain
copy

  1. NSInteger customSort(id obj1, id obj2,void* context){  
  2.  if ([obj1 integerValue] > [obj2 integerValue]) {  
  3.         return (NSComparisonResult)NSOrderedDescending;  
  4.     }  
  5.    
  6.     if ([obj1 integerValue] < [obj2 integerValue]) {  
  7.         return (NSComparisonResult)NSOrderedAscending;  
  8.     }  
  9.     return (NSComparisonResult)NSOrderedSame;  
  10. }  
  11.  NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];  
  12.  //排序前  
  13.  NSMutableString *outputBefore = [[NSMutableString alloc] init];  
  14.  for(NSString *str in sortArray){  
  15.   [outputBefore appendFormat:@"];  
  16.  }  
  17.  NSLog(@"排序前:%@",outputBefore);  
  18.  [outputBefore release];  
  19.    
  20.  NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];  
  21.    
  22.  NSMutableString *outputAfter = [[NSMutableString alloc] init];  
  23.  for(NSString *str in array){  
  24.   [outputAfter appendFormat:@"];  
  25.  }  
  26.  NSLog(@"排序后:%@",outputAfter);  
  27.  [outputAfter release];  

第三种 利用sortUsingDescriptors调用NSSortDescriptor

 

[plain] view
plain
copy

  1. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price为数组中的对象的属性,这个针对数组中存放对象比较更简洁方便  
  2.   NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];  
  3.   [_totalInfoArray sortUsingDescriptors:sortDescriptors];  
  4.   [_airListView refreshTable:_totalInfoArray];  
  5.   [sortDescriptor release];  
  6.   [sortDescriptors release];  

20120619更新

排序操作,NSArray提供了很多种方法,按照所利用的排序参数,可以简单分为descriptor,selector,function,和block排序。
数组排序的时候有sortedArrayUsingComparator方法,这里的参数为NSComparator,这个类其实是Block所定义的
typedef NSComparisonResult (^NSComparator)(id obj1,id obj2);
所以我们直接用NSComparator myComparator=^(id obj1,id obj2){};
Block其实可以看作JS里面的(){}();方法以及.Net中的匿名方法,即不需要声明就直接使用的方法,主要用处包括回调、事件处理和排序。声明和实现可以分开,也可以写在一起:

[plain] view
plain
copy

  1. NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s)  
  2. {  
  3.        NSLog(@"%d,%@",i,s);  
  4. };  
  5. blockExample(42,@"hello");  


对于NSArray排序或者其他需要Block作为参数的函数来说,可以写成下面两种形式:
//声明和使用


[plain] view
plain
copy

  1. NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) {  
  2.     // 比较函数的实现  
  3. };  
  4.     NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator];  
  5. // 不声明,彻底匿名使用  
  6.     NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) { //...  
  7.     }];  





例子:

[plain] view
plain
copy

  1.  NSArray    *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil];  
  2.   
  3.   
  4.     array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {  
  5.         return (arc4random() % 3) - 1;  
  6.     }];  
  7.   
  8.   
  9.    // NSLog(@"array:%@", array);  
  10.   
  11.   
  12.     NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {   
  13.   
  14.   
  15.         if ([obj1 integerValue] > [obj2 integerValue]) {   
  16.             return (NSComparisonResult)NSOrderedAscending;   
  17.         }   
  18.   
  19.   
  20.         if ([obj1 integerValue] < [obj2 integerValue]) {   
  21.             return (NSComparisonResult)NSOrderedDescending;   
  22.         }   
  23.         return (NSComparisonResult)NSOrderedSame;   
  24.   
  25.   
  26.     }];   
  27.   
  28.   
  29.   
  30.   
  31. sortedArray 是排好序的时间对象数组  
  32.   
  33.   
  34.     // 按时间排序  
  35.   
  36.   
  37.     NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2)  
  38.   
  39.   
  40.                             {  
  41.   
  42.   
  43.                                 NSComparisonResult result = [obj1 compare:obj2];  
  44.   
  45.   
  46.                                 switch(result)  
  47.                                 {  
  48.                                     case NSOrderedAscending:  
  49.                                         return NSOrderedDescending;              
  50.                                     case NSOrderedDescending:  
  51.                                         return NSOrderedAscending;  
  52.                                     case NSOrderedSame:  
  53.                                         return NSOrderedSame;  
  54.                                     default:  
  55.                                         return NSOrderedSame;    
  56.                                 } // 时间从近到远(远近相对当前时间而言)  
  57.   
  58.   
  59.                             }];  


//随机排序

[plain] view
plain
copy

  1. NSArray    *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];  
  2.     array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {  
  3.         return (arc4random() % 3) - 1;  
  4.     }];  
  5.     NSLog(@"array:%@", array);  

抱歉!评论已关闭.