iOS筆記之?dāng)?shù)組排序

簡(jiǎn)單說(shuō)明

數(shù)組排序比較多坡疼,我們講一種比較常用的,這里涉及到一個(gè)知識(shí)點(diǎn):
NSComparisonResult:

typedef enum NSComparisonResult : NSInteger {
    NSOrderedAscending = -1L,
    NSOrderedSame,
    NSOrderedDescending
} NSComparisonResult;

文檔解釋

NSOrderedAscending:左邊數(shù)據(jù)比右邊小柄沮,可理解成增序
NSOrderedSame:相等
NSOrderedDescending:左邊數(shù)據(jù)比右邊大回梧,可理解成降序


示例:

NSArray *array = @[@"Benz",@"BMW",@"Ferrari",@"Lamborghini"];

1、普通排序系統(tǒng)自帶的升序

NSArray *sortedArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"普通排序:%@",sortedArray1);

2祖搓、逆轉(zhuǎn)數(shù)組

NSArray *sortedArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
  //逆轉(zhuǎn)
  return NSOrderedDescending;
}];
NSLog(@"逆轉(zhuǎn)數(shù)組:%@",sortedArray2);

3狱意、不逆轉(zhuǎn)(相當(dāng)于原數(shù)組)

NSArray *sortedArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
  //不逆轉(zhuǎn)
  return NSOrderedAscending;
}];
NSLog(@"不逆轉(zhuǎn)(原數(shù)據(jù)):%@",sortedArray3);

4、 升序排列

NSArray *sortedArray4 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) {
  //升序
  NSComparisonResult result = [obj1 compare: obj2];
  return result;
}];
NSLog(@"升序排列:%@",sortedArray4);

5拯欧、降序排列

NSArray *sortedArray5 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  //降序
  NSComparisonResult result = [obj1  compare: obj2];
  return -result;
}];
NSLog(@"降序排列:%@",sortedArray5);
輸出結(jié)果

進(jìn)階:

數(shù)組里面存放模型详囤,根據(jù)模型的某個(gè)屬性值來(lái)對(duì)數(shù)組進(jìn)行重新排序
1)、初始化一些車輛和數(shù)組:

Car *benz = [Car new];
benz.name = @"Benz";
benz.price = 2000.0;
    
Car *bmw = [Car new];
bmw.name = @"BMW";
bmw.price = 800;
    
Car *ferrari = [Car new];
ferrari.name = @"Ferrari";
ferrari.price = 1200;
    
Car *lamborghini = [Car new];
lamborghini.name = @"Lamborghini";
lamborghini.price = 12000;
    
NSMutableArray *array = @[benz,bmw,ferrari,lamborghini].mutableCopy;

2)镐作、排序方法

/**
 對(duì)數(shù)組里存放model的某個(gè)屬性對(duì)數(shù)組進(jìn)行重新排序

 @param array 待排序數(shù)組
 @param increase 是否增序排列
 @param key 屬性
 @return <#return value description#>
 */
-(NSArray *)sortArray:(NSArray *)array increase:(BOOL)increase byKey:(NSString *)key{
    
    array = [array sortedArrayUsingComparator:
             ^NSComparisonResult(Car *obj1, Car *obj2) {
                 NSComparisonResult result;
                 if ([key isEqualToString:@"price"]) {
                     CGFloat res1 = [[obj1 valueForKey:key] floatValue];
                     CGFloat res2 = [[obj2 valueForKey:key] floatValue];
                     if (increase) {
                         if (res1 < res2){
                             result = NSOrderedAscending;
                         }else {
                             result = NSOrderedDescending;
                         }
                     } else {
                         if (res1 < res2){
                             result = NSOrderedDescending;
                         }else {
                             result = NSOrderedAscending;
                         }
                     }
                 } else {
                     result = [[obj1 valueForKey:key] compare:[obj2 valueForKey:key]];
                     if (!increase) {
                         if (result == NSOrderedDescending) {
                             result = NSOrderedAscending;
                         } else if (result == NSOrderedAscending) {
                             result = NSOrderedDescending;
                         }
                     }
                 }
                 
                 return result;
             }].mutableCopy;
    return array;
}

3)藏姐、打印結(jié)果

NSArray *sortArray;
sortArray = [self sortArray:array increase:YES byKey:@"price"];
NSLog(@"increase by price:");
for (Car *c in sortArray) {
  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}

NSLog(@"------分割線------");

sortArray = [self sortArray:array increase:NO byKey:@"price"];
NSLog(@"descend by price:");
for (Car *c in sortArray) {
  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}

NSLog(@"------分割線------");
    
sortArray = [self sortArray:array increase:YES byKey:@"name"];
NSLog(@"increase by name:");
for (Car *c in sortArray) {
  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}

NSLog(@"------分割線------");
    
sortArray = [self sortArray:array increase:NO byKey:@"name"];
NSLog(@"descend by name:");
for (Car *c in sortArray) {
  NSLog(@"car:%@ -->price:%lf\n",c.name,c.price);
}

輸出結(jié)果

Warnning:可能有眼尖的看客發(fā)現(xiàn)了,increase by namedescend by name順序不對(duì)该贾,升序的時(shí)候Benz不應(yīng)該在BMW前面嗎羔杨?降序Benz在BMW后面嗎?注意杨蛋,這里M是大寫(xiě)兜材,而e是小寫(xiě)理澎,大寫(xiě)的ASCII碼在小寫(xiě)前面,所以M比e前曙寡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糠爬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子举庶,更是在濱河造成了極大的恐慌执隧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户侥,死亡現(xiàn)場(chǎng)離奇詭異镀琉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蕊唐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門滚粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刃泌,你說(shuō)我怎么就攤上這事∈鹩龋” “怎么了耙替?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曹体。 經(jīng)常有香客問(wèn)我俗扇,道長(zhǎng),這世上最難降的妖魔是什么箕别? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任铜幽,我火速辦了婚禮,結(jié)果婚禮上串稀,老公的妹妹穿的比我還像新娘除抛。我一直安慰自己,他們只是感情好母截,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布到忽。 她就那樣靜靜地躺著,像睡著了一般清寇。 火紅的嫁衣襯著肌膚如雪喘漏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天华烟,我揣著相機(jī)與錄音翩迈,去河邊找鬼。 笑死盔夜,一個(gè)胖子當(dāng)著我的面吹牛负饲,可吹牛的內(nèi)容都是我干的堤魁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绽族,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姨涡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吧慢,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涛漂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后检诗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匈仗,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年逢慌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悠轩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攻泼,死狀恐怖火架,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忙菠,我是刑警寧澤何鸡,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站牛欢,受9級(jí)特大地震影響骡男,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傍睹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一隔盛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拾稳,春花似錦吮炕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至震鹉,卻和暖如春俱笛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背传趾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工迎膜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浆兰。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓磕仅,卻偏偏與公主長(zhǎng)得像珊豹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榕订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 數(shù)組可對(duì)其中包含的元素進(jìn)行排序店茶。 在排序前,我們需要定義一個(gè)Model類劫恒,將Model類對(duì)象添加至數(shù)組中贩幻。 定義一...
    SkyMing一C閱讀 10,923評(píng)論 0 15
  • 排序規(guī)則描述類: NSSortDescriptor NSSortDescriptor來(lái)指定排序規(guī)則, 對(duì)集合等進(jìn)行...
    SkyMing一C閱讀 6,581評(píng)論 3 12
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法两嘴,內(nèi)部類的語(yǔ)法丛楚,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法憔辫,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,625評(píng)論 18 399
  • 曾經(jīng)有個(gè)人贰您,但偏偏風(fēng)雨漸大坏平,大到我看不到他。 ——題記 記得早...
    muamon閱讀 203評(píng)論 0 0