在講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];
其中只有第一個程序能夠正常運行