Objective-C之NSArray(數組)默認排序與自定義排序

在講OC中數組的排序以前我先上一段代碼,它是簡單數組排序的一種方法(也就是元素是字符串或者數據的數組,由於後面要講元素爲類的數組排序)數組

代碼1:框架

1 NSArray *sortArr4 = [sortArr3 sortedArrayUsingComparator:^NSComparisonResult/*代碼塊返回值類型*/(id obj1, id obj2) 2  { 3              return [obj1 compare:obj2];//根據比較結果,若是結果是1,則交換
4  }]; 5         NSLog(@"%@",sortArr4);

上面的程序中定義的一個sortArr4的數組,它來自於sortArr3的排序結果(注意:是升序)。第三行中的「obj1 compare:obj2」,還記得compare:是個什麼東東嗎?他是咱們數組(NSString)那一節中的一個字符串比較方法,以下我把以前的代碼複製過來了:函數

代碼2:atom

2        NSComparisonResult/*枚舉類型*/ result = [@"CBA" compare:@"abc" ] ;

      比較以後返回了一個名字爲NSComparisonResult的枚舉類型(取值-1(小於),0(等於),1(大於)),快看,它跟代碼1中的「:^」後的名字是同樣的。爲何呢?由於這必需要同樣。compare:比較以後的返回值傳向了NSArray的一個方法「sortedArrayUsingComparator:」,它內部機制是咱們看不到的,由於OC代碼不開源。咱們只知道它得到了值1時,就是compare:比較返回值爲1時,會把數組元素進行交換,應該相似於C語言中的冒泡排序,我估計它內部有循環機制,否則循環一次的位置調換是沒法正確排序的。spa

      好了,上面的代碼就是字符串排序的做用,你們有沒有注意到"[]"闊的範圍把整個函數都闊住了。其實,它不算是個函數,「{}」裏面放的只是一個咱們自定義的能返回NSComparisonResult的枚舉類型範圍的代碼。咱們也能夠經過if.else來實現,只是那樣不利於字符串的比較,假如數組裏面是數據,那樣用if.else就簡單多了。   code

下面進入正題:orm

代碼3對象

1       NSArray *sortArr = @[@"4",@"1",@"5",@"3"]; 2        NSArray *sortArr1 = [sortArr sortedArrayUsingSelector/*排序數組使用選擇器*/:@selector(compare:)]; 3       // @selector是關鍵字(告訴編譯器要執行一個方法),後面跟的是函數或自定義函數,總之就是具備比較功能,能返回NSComparisonResult類型的函數 4        //compare:返回調用結果比較:不帶任何選項的選擇:範圍:和接收機的所有範圍。
5         NSLog(@"%@",sortArr1); 6         
7        // IOS提供一個sortedArrayUsingSelector ()函數,用於對字符串數組進行排序,方法會在排序後返回一個新的數組。 8         //[array sortedArrayUsingSelector (@selector(xxxx:))]; 9         //xxxx:方法須要你本身根據實際狀況設定排序方式。有默認的排序方法 compare :

     代碼註釋中已將講了「compare:」是一個方法,它也能夠咱們本身定義,當數組元素比較複雜時,「compare:」沒法知足比較。例如一個元素爲學生對象的數組,數組每一個元素都包含了學生的年齡,性別,分數,姓名等等,那用「compare:」怎麼比?是沒辦法比得。因此就須要咱們自定義方法,別的地方都不用改變,只須要把「compare:」改成咱們自定義的方法就好了。那麼這個方法怎麼定義呢?首先,咱們要明確的知道,這個方法有形參,形參應該與數組元素同等類型,由於要對元素(類的對象)的部分紅員進行比較;有返回值而且是NSComparisonResult類型的返回值。下面看代碼:blog

代碼4:排序

 

1 @interface Student : NSObject 2 
3 @property(nonatomic,strong)NSString *name; 4 @property(nonatomic,assign) int age; 5 
6 -(NSComparisonResult)compareWithName:(Student *)stu;//比較name的方法,返回Foundation框架方法的夠處理的NSComparisonResult類型
7 -(NSComparisonResult)compareWithAge:(Student *)stu;//比較age的方法,返回Foundation框架方法的夠處理的NSComparisonResult類型
8 
9 @end

 

      代碼4是定義Student類的.h文件,首先聲明瞭名字和年齡的屬性,後面聲明瞭前面講到的須要取代替"compare:"的一個比較方法,就是自定義方法。代碼5中是該方法的實現部分。

代碼5:

 

 1 @implementation Student  2 -(NSComparisonResult)compareWithName:(Student *)stu  3 {  4     return [self.name compare:stu.name];  5 }  6 -(NSComparisonResult)compareWithAge:(Student *)stu  7 {  8     if( self.age < stu.age ) return -1;  9     else if( self.age == stu.age ) return 0; 10     else return 1; 11 } 12 -(NSString *)description//方法重寫
13 { 14     return [NSString stringWithFormat:@"%@,%i",_name,_age]; 15 } 16 @end

 

     注意註釋處的方法重寫部分,假如利用代碼6中的1七、18行輸出方法會輸出地址。因此在這裏重寫了description(描述方法),就是把類對象中的年齡和姓名以字符串形式拼接起來,這樣的話能夠直接對數組進行打印輸出。

代碼6:

 1 int main(int argc, const char * argv[])  2 {  3  @autoreleasepool  4  {  5         Student *student1 = [[Student alloc] init];  6         Student *student2 = [[Student alloc] init];  7         Student *student3 = [[Student alloc] init];  8         student1.name = @"zhangsan";  9         student1.age = 16; 10         student2.name = @"lisi"; 11         student2.age = 20; 12         student3.name = @"wangwu"; 13         student3.age = 23; 14         NSArray *myAray = @[student1,student2,student3]; 15         NSArray *meToArray = [myAray sortedArrayUsingSelector:@selector(compareWithName:)]; 16         NSArray *comeToArray = [myAray sortedArrayUsingSelector:@selector(compareWithAge:)]; 17 // NSLog(@"%@",meToArray);//打印的是地址 18 // NSLog(@"%@",comeToArray);
19         NSLog(@"%@",meToArray);//打印的是地址
20         NSLog(@"%@",comeToArray); 21         
22  } 23     return 0; 24 }

 

1 //第二種方法,描述器排序 2         //先建立排序條件:key對應要排序的對象的屬性名字
3         NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES]; 4         NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES]; 5         //將描述條件放入排序數組(用於盛放排序條件,能夠多個) 6         //先按成績升序排序,成績同樣的狀況,再按年齡升序排序
7         NSArray *desArr = @[sort,sort1]; 8         NSArray *sortArr1 = [myAray sortedArrayUsingDescriptors:desArr]; 
9 NSLog(@"--->%@",sortArr1);

 

 

1、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss addObjectsFromArray:ddd];
[sss removeObjectAtIndex:0];

2、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss copy];
[sss removeObjectAtIndex:0];

3、 NSMutableArray *sss = [NSMutableArray arrayWithCapacity:0];
NSArray *ddd = @[@"12323456",@"155",@"8588" ];
[sss arrayByAddingObjectsFromArray:ddd];
[sss removeObjectAtIndex:0];

 

其中只有第一個程序能夠正常運行

相關文章
相關標籤/搜索