日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC中数组排序的3种方法

發(fā)布時(shí)間:2024/8/26 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC中数组排序的3种方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

總結(jié)OC中數(shù)組排序3種方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:

大體上,OC中常用的數(shù)組排序有以下幾種方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors:。

?

1、簡單排序(sortedArrayUsingSelector:)

如果只是對字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了,代碼如下

//簡單排序 void sortArray1(){NSArray *array = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];NSLog(@"排序后:%@",sortedArray); }

當(dāng)然,除了利用字符串自帶的compare:方法,也可以自己寫compare:方法,進(jìn)行對象的比較;如下:

首先是新建了Person類,實(shí)現(xiàn)方法如下(頭文件就省了):

#import "Person.h" @implementation Person//直接實(shí)現(xiàn)靜態(tài)方法,獲取帶有name和age的Person對象 +(Person *)personWithAge:(int) age withName:(NSString *)name{Person *person = [[Person alloc] init];person.age = age;person.name = name;return person; }//自定義排序方法 -(NSComparisonResult)comparePerson:(Person *)person{//默認(rèn)按年齡排序NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本數(shù)據(jù)類型要進(jìn)行數(shù)據(jù)轉(zhuǎn)換//如果年齡一樣,就按照名字排序if (result == NSOrderedSame) {result = [self.name compare:person.name];}return result; }@end

主函數(shù)代碼如下:

void sortArray2(){Person *p1 = [Person personWithAge:23 withName:@"zhangsan"];Person *p2 = [Person personWithAge:21 withName:@"lisi"];Person *p3 = [Person personWithAge:24 withName:@"wangwu"];Person *p4 = [Person personWithAge:24 withName:@"liwu"];Person *p5 = [Person personWithAge:20 withName:@"liwu"];NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(comparePerson:)];NSLog(@"排序后:%@",sortedArray); }

?

2、利用block語法(sortedArrayUsingComparator:)

蘋果官方提供了block語法,比較方便。其中數(shù)組排序可以用sortedArrayUsingComparator:方法,代碼如下:

void sortArray3(){NSArray *array = [NSArray arrayWithObjects:@"1bc",@"4b6",@"123",@"789",@"3ef", nil];NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {//這里的代碼可以參照上面compare:默認(rèn)的排序方法,也可以把自定義的方法寫在這里,給對象排序NSComparisonResult result = [obj1 compare:obj2];return result;}];NSLog(@"排序后:%@",sortedArray); }

?

3、高級排序(sortedArrayUsingDescriptors:)

如果是這樣一種情況呢?Person類里有另外一個(gè)類的變量,比如說Person類除了name,age變量,還有一輛車Car類型,Car類里有個(gè)name屬性。對Person對象進(jìn)行排序,有這樣的要求:按照Car的name排序,如果是同一輛車,也就是Car的name相同,那么再按照年齡進(jìn)行排序,如果年齡也相同,最后按照Person的name進(jìn)行排序。

上面這樣就要使用第三種方法,利用排序描述器,不多說,有興趣可以看看API介紹。代碼如下:

首先寫個(gè)Car類,實(shí)現(xiàn)類Car.m代碼如下:

#import "Car.h" @implementation Car+(Car *)initWithName:(NSString *)name{Car *car = [Car alloc] init];car.name = name;return car; }@end

然后改寫Person類,實(shí)現(xiàn)類Person.m代碼如下:

#import "Person.h" #import "Car.h" @implementation Person+(Person *)personWithAge:(int)age withName:(NSString *)name withCar:(Car *)car{Person *person = [[Person alloc] init];person.age = age;person.name = name;person.car = car;return person; }//這里重寫description方法,用于最后測試排序結(jié)果顯示 -(NSString *)description{return [NSString stringWithFormat:@"age is %zi , name is %@, car is %@",_age,_name,_car.name]; }@end

主函數(shù)代碼如下:

void sortArray4(){//首先來3輛車,分別是奧迪、勞斯萊斯、寶馬Car *car1 = [Car initWithName:@"Audio"];Car *car2 = [Car initWithName:@"Rolls-Royce"];Car *car3 = [Car initWithName:@"BMW"];//再來5個(gè)Person,每人送輛車,分別為car2、car1、car1、car3、car2Person *p1 = [Person personWithAge:23 withName:@"zhangsan" withCar:car2];Person *p2 = [Person personWithAge:21 withName:@"zhangsan" withCar:car1];Person *p3 = [Person personWithAge:24 withName:@"lisi" withCar:car1];Person *p4 = [Person personWithAge:23 withName:@"wangwu" withCar:car3];Person *p5 = [Person personWithAge:23 withName:@"wangwu" withCar:car2];//加入數(shù)組NSArray *array = [NSArray arrayWithObjects:p1,p2,p3,p4,p5, nil];//構(gòu)建排序描述器NSSortDescriptor *carNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"car.name" ascending:YES];NSSortDescriptor *personNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];NSSortDescriptor *personAgeDesc = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//把排序描述器放進(jìn)數(shù)組里,放入的順序就是你想要排序的順序//我這里是:首先按照年齡排序,然后是車的名字,最后是按照人的名字NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc,carNameDesc,personNameDesc, nil];NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];NSLog(@"%@",sortedArray); }

結(jié)果如下:

從結(jié)果看出,先按照age排序,如果age相同,按照car排序,如果car相同,按照name排序。

(注意:上面兩種排序方法要想實(shí)現(xiàn)字符串顯示,請重寫description方法)

?

轉(zhuǎn)載于:https://www.cnblogs.com/W-Kr/p/5095220.html

總結(jié)

以上是生活随笔為你收集整理的OC中数组排序的3种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。