IOS幾種簡單有效的陣列排序方法

征途LN發表於2014-02-19


//第一種,利用陣列的sortedArrayUsingComparator呼叫 NSComparator ,obj1和obj2指的陣列中的物件


[plain]
NSComparator cmptr = ^(id obj1, id obj2){ 
 if ([obj1 integerValue] > [obj2 integerValue]) { 
        return (NSComparisonResult)NSOrderedDescending; 
    } 
  
    if ([obj1 integerValue] < [obj2 integerValue]) { 
        return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}; 
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; 
 //排序前 
 NSMutableString *outputBefore = [[NSMutableString alloc] init]; 
 for(NSString *str in sortArray){ 
  [outputBefore appendFormat:@"]; 
 } 
 NSLog(@"排序前:%@",outputBefore); 
 [outputBefore release]; 
 //第一種排序 
 NSArray *array = [sortArray sortedArrayUsingComparator:cmptr]; 
  
 NSMutableString *outputAfter = [[NSMutableString alloc] init]; 
 for(NSString *str in array){ 
  [outputAfter appendFormat:@"]; 
 } 
 NSLog(@"排序後:%@",outputAfter); 
 [outputAfter release]; 

NSComparator cmptr = ^(id obj1, id obj2){
 if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
 
    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};
NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
 //排序前
 NSMutableString *outputBefore = [[NSMutableString alloc] init];
 for(NSString *str in sortArray){
  [outputBefore appendFormat:@"];
 }
 NSLog(@"排序前:%@",outputBefore);
 [outputBefore release];
 //第一種排序
 NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
 
 NSMutableString *outputAfter = [[NSMutableString alloc] init];
 for(NSString *str in array){
  [outputAfter appendFormat:@"];
 }
 NSLog(@"排序後:%@",outputAfter);
 [outputAfter release];

 

第二種 排序方法 利用sortedArrayUsingFunction 呼叫 對應方法customSort,這個方法中的obj1和obj2分別是指陣列中的物件。


[plain]
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 *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil]; 
 //排序前 
 NSMutableString *outputBefore = [[NSMutableString alloc] init]; 
 for(NSString *str in sortArray){ 
  [outputBefore appendFormat:@"]; 
 } 
 NSLog(@"排序前:%@",outputBefore); 
 [outputBefore release]; 
  
 NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil]; 
  
 NSMutableString *outputAfter = [[NSMutableString alloc] init]; 
 for(NSString *str in array){ 
  [outputAfter appendFormat:@"]; 
 } 
 NSLog(@"排序後:%@",outputAfter); 
 [outputAfter release]; 

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 *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
 //排序前
 NSMutableString *outputBefore = [[NSMutableString alloc] init];
 for(NSString *str in sortArray){
  [outputBefore appendFormat:@"];
 }
 NSLog(@"排序前:%@",outputBefore);
 [outputBefore release];
 
 NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
 
 NSMutableString *outputAfter = [[NSMutableString alloc] init];
 for(NSString *str in array){
  [outputAfter appendFormat:@"];
 }
 NSLog(@"排序後:%@",outputAfter);
 [outputAfter release];

 

第三種 利用sortUsingDescriptors呼叫NSSortDescriptor

 

[plain]
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price為陣列中的物件的屬性,這個針對陣列中存放物件比較更簡潔方便 
  NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; 
  [_totalInfoArray sortUsingDescriptors:sortDescriptors]; 
  [_airListView refreshTable:_totalInfoArray]; 
  [sortDescriptor release]; 
  [sortDescriptors release]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"price" ascending:NO];//其中,price為陣列中的物件的屬性,這個針對陣列中存放物件比較更簡潔方便
  NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];
  [_totalInfoArray sortUsingDescriptors:sortDescriptors];
  [_airListView refreshTable:_totalInfoArray];
  [sortDescriptor release];
  [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 plaincopyprint?NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s) 

       NSLog(@"%d,%@",i,s); 
}; 
blockExample(42,@"hello"); 

NSInteger (^blockExample)(int,NSString*)=^(int i,NSString *s)
{
       NSLog(@"%d,%@",i,s);
};
blockExample(42,@"hello");
對於NSArray排序或者其他需要Block作為引數的函式來說,可以寫成下面兩種形式:
//宣告和使用


[plain]
NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) { 
    // 比較函式的實現 
}; 
    NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator]; 
// 不宣告,徹底匿名使用 
    NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) { //... 
    }]; 

NSComparison ( ^ageComparator )( id, id ) = ^( id o1, id o2 ) {
    // 比較函式的實現
};
    NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:ageComparator];
// 不宣告,徹底匿名使用
    NSArray* objs_sortedByComparator = [objs sortedArrayUsingComparator:^( id o1, id o2 ) { //...
    }];

 

例子:

[plain]
NSArray    *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil]; 
 
 
    array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) { 
        return (arc4random() % 3) - 1; 
    }]; 
 
 
   // NSLog(@"array:%@", array); 
 
 
    NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {  
 
 
        if ([obj1 integerValue] > [obj2 integerValue]) {  
            return (NSComparisonResult)NSOrderedAscending;  
        }  
 
 
        if ([obj1 integerValue] < [obj2 integerValue]) {  
            return (NSComparisonResult)NSOrderedDescending;  
        }  
        return (NSComparisonResult)NSOrderedSame;  
 
 
    }];  
 
 
 
 
sortedArray 是排好序的時間物件陣列 
 
 
    // 按時間排序 
 
 
    NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2) 
 
 
                            { 
 
 
                                NSComparisonResult result = [obj1 compare:obj2]; 
 
 
                                switch(result) 
                                { 
                                    case NSOrderedAscending: 
                                        return NSOrderedDescending;             
                                    case NSOrderedDescending: 
                                        return NSOrderedAscending; 
                                    case NSOrderedSame: 
                                        return NSOrderedSame; 
                                    default: 
                                        return NSOrderedSame;   
                                } // 時間從近到遠(遠近相對當前時間而言) 
 
 
                            }]; 

 NSArray    *array = [NSArray arrayWithObjects:@"71", @"16", @"51", @"104", @"13",@"2",@"1", nil];


    array = [array sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2) {
        return (arc4random() % 3) - 1;
    }];


   // NSLog(@"array:%@", array);


    NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {


        if ([obj1 integerValue] > [obj2 integerValue]) {
            return (NSComparisonResult)NSOrderedAscending;
        }


        if ([obj1 integerValue] < [obj2 integerValue]) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        return (NSComparisonResult)NSOrderedSame;


    }];

 


sortedArray 是排好序的時間物件陣列


    // 按時間排序


    NSArray *sortedArray = [srcArrary sortedArrayUsingComparator:^(id obj1, id obj2)


                            {


                                NSComparisonResult result = [obj1 compare:obj2];


                                switch(result)
                                {
                                    case NSOrderedAscending:
                                        return NSOrderedDescending;           
                                    case NSOrderedDescending:
                                        return NSOrderedAscending;
                                    case NSOrderedSame:
                                        return NSOrderedSame;
                                    default:
                                        return NSOrderedSame; 
                                } // 時間從近到遠(遠近相對當前時間而言)


                            }];

//隨機排序


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

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



文章連結:http://www.2cto.com/kf/201209/155323.html

相關文章