[Object C]_[初級]_[NSArray排序]

場景:根據需求讓數據內的元素有序排列。

下面是具體實例說明。

ArrayObject.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString  *_name;
    
    NSInteger  _age;
}
@property (readwrite, copy) NSString  *_name;
@property (readwrite, assign) NSInteger  _age;
@end

@interface ArrayObject : NSObject

-(void)testSortedArrayUsingComparater;
-(void) testSortArrayUsingSelector;
-(void) testSortedArrayUsingFunction;
-(void) doTestSortUsingDescriptors;

@end

ArrayObject.m

#import "ArrayObject.h"
@implementation Person
@synthesize _name;
@synthesize  _age;


- (void)dealloc
{
    [_name release];
    
    [super dealloc];
}

@end

@implementation ArrayObject


//第一種,利用數組的sortedArrayUsingComparator調用 NSComparator ,obj1和obj2指的數組中的對象
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;
};

-(void)testSortedArrayUsingComparater
{
    NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
    //排序前
    NSMutableString *beforeStr = [NSMutableString new];
    for(NSString *str in sortArray)
    {
        [beforeStr appendFormat:@"%@ ",str];
    }
     NSLog(@"排序前:%@",beforeStr);
     [beforeStr release];
     //第一種排序
     NSArray *array = [sortArray sortedArrayUsingComparator:cmptr];
     
     NSMutableString *afterStr = [NSMutableString new];
     for(NSString *str in array){
         [afterStr appendFormat:@"%@ ",str];
      }
      NSLog(@"排序後:%@",afterStr);
      [afterStr release];

}

輸出結果:



//第二種排序算法 利用sortedArrayUsingSelector調用系統定義的compare:,主要是對字符串的比較

-(void) testSortArrayUsingSelector
{
    NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
    //排序前
     NSMutableString *beforeStr = [NSMutableString new];
    for(NSString *str in sortArray)
    {
        [beforeStr appendFormat:@"%@ ",str];
    }
    NSLog(@"排序前:%@",beforeStr);
    [beforeStr release];
    //第一種排序
    //- (NSComparisonResult)compare:(NSString *)string;//比較字符串的大小
    //- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask; 比較字符串,按mask的參數進行比較
   //mask 參數可以是: NSCaseInsensitiveSearch, NSLiteralSearch, NSNumericSearch.
    
    NSArray *array =[sortArray sortedArrayUsingSelector:@selector(compare:options:)];
    
     NSMutableString *affterStr = [NSMutableString new];
    for(NSString *str in array){
        [affterStr appendFormat:@"%@ ",str];
    }
    NSLog(@"排序後:%@",affterStr);
    [affterStr release];

}
輸出結果:


若把

NSArray *array =[sortArray sortedArrayUsingSelector:@selector(compare:options:)];中<pre name="code" class="objc">compare:options:改爲compare:,則輸出結果爲:



//第三種 排序方法 利用sortedArrayUsingFunction 調用 對應方法customSort,這個方法中的obj1和obj2分別是指數組中的對象。

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;
}
-(void) testSortedArrayUsingFunction
{
    NSArray *sortArray = [[NSArray alloc] initWithObjects:@"10",@"13",@"5",@"15",@"8",@"20",@"1",@"5",@"3",@"7",@"45",@"4",@"23",@"",nil];
    //排序前
    NSMutableString *beforeStr = [NSMutableString new];
    for(NSString *str in sortArray){
    [beforeStr appendFormat:@"%@ ",str];
     }
     NSLog(@"排序前:%@",beforeStr);
     [beforeStr release];
     
     NSArray *array = [sortArray sortedArrayUsingFunction:customSort context:nil];
     
     NSMutableString *afterStr = [NSMutableString new];
     for(NSString *str in array){
         [afterStr appendFormat:@"%@ ",str];
          }
      NSLog(@"排序後:%@",afterStr);
      [afterStr release];

}

輸出結果:


//第四種 利用sortUsingDescriptors調用NSSortDescriptor

-(void) doTestSortUsingDescriptors
{
    Person *person1 = [[Person alloc] init];
    [person1 set_name:@"ABCD"];
    [person1 set_age:24];
    
    Person *person2 = [[Person alloc] init];
    [person2 set_name:@"ACBA"];
    [person2 set_age:22];
    
    Person *person3 = [[Person alloc] init];
    [person3 set_name:@"ABDC"];
    [person3 set_age:33];
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
    [person1 release];
    [person2 release];
    [person3 release];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"_name" ascending:YES];//YES降序,NO升序
    //這個數組保存的是排序好的對象
    NSArray *tempArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    for (Person *ii in tempArray) {
         NSLog(@"name:%@,age:%ld",ii._name,ii._age);
    }

}

@end

輸出結果:

降序:ascending:YES


升序:ascending:NO


用數據結構排序算法對NSArray進行排序,項目代碼點擊鏈接下載:

http://download.csdn.net/detail/moqj_123/9252059


發佈了101 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章