OC中數(shù)組幾種排序總結(jié)

一份汗、數(shù)組排序


  1. 簡單排序(sortedArrayUsingSelector:)
    如果只是對字符串的排序,可以利用sortedArrayUsingSelector:方法就可以了纸巷,代碼如下
//簡單排序
void sortArray1(){
    NSArray *array = [NSArray arrayWithObjects:@"abc",@"456",@"123",@"789",@"ef", nil];
    NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"排序后:%@",sortedArray);
}

當然御滩,除了利用字符串自帶的compare:方法缴川,也可以自己寫compare:方法,進行對象的比較额湘;如下:
首先是新建了Person類卿吐,實現(xiàn)方法如下(頭文件就省了):

#import "Person.h"
@implementation Person
//直接實現(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{
  //默認按年齡排序
    NSComparisonResult result = [[NSNumber numberWithInt:person.age] compare:[NSNumber numberWithInt:self.age]];//注意:基本數(shù)據(jù)類型要進行數(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);
}
  1. 利用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:默認的排序方法谨湘,也可以把自定義的方法寫在這里,給對象排序
        NSComparisonResult result = [obj1 compare:obj2];
        return result;
    }];
    NSLog(@"排序后:%@",sortedArray);
}
  1. 高級排序(sortedArrayUsingDescriptors:)
    如果是這樣一種情況呢芥丧?Person類里有另外一個類的變量紧阔,比如說Person類除了name,age變量续担,還有一輛車Car類型擅耽,Car類里有個name屬性。對Person對象進行排序物遇,有這樣的要求:按照Car的name排序乖仇,如果是同一輛車憾儒,也就是Car的name相同,那么再按照年齡進行排序乃沙,如果年齡也相同起趾,最后按照Person的name進行排序。
    上面這樣就要使用第三種方法警儒,利用排序描述器训裆,不多說,有興趣可以看看API介紹蜀铲。代碼如下:
    首先寫個Car類边琉,實現(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類,實現(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個Person定欧,每人送輛車,分別為car2蹄衷、car1忧额、car1、car3愧口、car2
        Person *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];
        
        //把排序描述器放進數(shù)組里,放入的順序就是你想要排序的順序
        //我這里是:首先按照年齡排序类茂,然后是車的名字耍属,最后是按照人的名字
        NSArray *descriptorArray = [NSArray arrayWithObjects:personAgeDesc,carNameDesc,personNameDesc, nil];
        
        NSArray *sortedArray = [array sortedArrayUsingDescriptors: descriptorArray];
        NSLog(@"%@",sortedArray);
}

結(jié)果如下:


1.png

從結(jié)果看出,先按照age排序巩检,如果age相同厚骗,按照car排序,如果car相同兢哭,按照name排序领舰。


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迟螺,一起剝皮案震驚了整個濱河市冲秽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矩父,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窍株,死亡現(xiàn)場離奇詭異民轴,居然都是意外死亡攻柠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門后裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰钮,“玉大人,你說我怎么就攤上這事微驶》赏浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵祈搜,是天一觀的道長较店。 經(jīng)常有香客問我,道長容燕,這世上最難降的妖魔是什么梁呈? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蘸秘,結(jié)果婚禮上官卡,老公的妹妹穿的比我還像新娘。我一直安慰自己醋虏,他們只是感情好寻咒,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颈嚼,像睡著了一般毛秘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阻课,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天叫挟,我揣著相機與錄音,去河邊找鬼限煞。 笑死抹恳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的署驻。 我是一名探鬼主播奋献,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旺上!你這毒婦竟也來了瓶蚂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抚官,失蹤者是張志新(化名)和其女友劉穎扬跋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌节,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钦听,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年洒试,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朴上。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡垒棋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痪宰,到底是詐尸還是另有隱情叼架,我是刑警寧澤衣撬,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乍构,受9級特大地震影響扛点,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陵究,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一铜邮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧返咱,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胁后。三九已至嗦枢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間文虏,已是汗流浹背殖演。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工趴久, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搔确,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓座硕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親华匾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組可對其中包含的元素進行排序瘦真。 在排序前黍瞧,我們需要定義一個Model類,將Model類對象添加至數(shù)組中印颤。 定義一...
    SkyMing一C閱讀 10,928評論 0 15
  • 數(shù)組 1年局、固定數(shù)組 2际看、可變數(shù)組 3仲闽、數(shù)組轉(zhuǎn)換 字典 1、不可變字典 2赖欣、可變字典 集合 //NSSet 是無序的...
    孫瑋超閱讀 14,105評論 0 13
  • <1>描述:字符串對象都可以排序// 創(chuàng)建描述對象就是對數(shù)組排序的验庙,它可以把數(shù)組中元素的某個屬性作為key 進行...
    向日葵_wwx閱讀 462評論 4 0
  • 面向?qū)ο笕笾е庋b:就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個有機的整體,形成數(shù)據(jù)和操作代碼的封裝體悴了,對外只提供一個可以控...
    WangDavid閱讀 1,683評論 0 2
  • 《父親像太陽》 文/白傳英 父親像太陽 在田里揮舞著時光 曾經(jīng)花開的年紀 如今已是滿目風(fēng)霜 母親像月亮 發(fā)...
    白清風(fēng)閱讀 398評論 0 0