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:

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

      比較之后返回了一個名字為NSComparisonResult的枚舉類型(取值-1(小於),0(等於),1(大於)),快看,它跟代碼1中的“:^”后的名字是一樣的。為什么呢?因為這必須要一樣。compare:比較之后的返回值傳向了NSArray的一個方法“sortedArrayUsingComparator:”,它內部機制是我們看不到的,因為OC代碼不開源。我們只知道它獲得了值1時,就是compare:比較返回值為1時,會把數組元素進行交換,應該類似於C語言中的冒泡排序,我估計它內部有循環機制,不然循環一次的位置調換是無法正確排序的。

      好了,上面的代碼就是字符串排序的作用,大家有沒有注意到"[]"闊的范圍把整個函數都闊住了。其實,它不算是個函數,“{}”里面放的只是一個我們自定義的能返回NSComparisonResult的枚舉類型范圍的代碼。我們也可以通過if.else來實現,只是那樣不利於字符串的比較,假如數組里面是數據,那樣用if.else就簡單多了。   

下面進入正題:

代碼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類型的返回值。下面看代碼:

代碼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中的17、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);

 

 

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

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

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

 

其中只有第一個程序可以正常運行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM