iOS 數(shù)組排序

Pre:很多文章對于SEL排序講解太過含糊辛块,特寫此文講述清楚畔派。

官方提供了幾個api進(jìn)行數(shù)組排序操作,開發(fā)者只需提供兩個元素的比較規(guī)則润绵,而無需關(guān)心元素在數(shù)組中是如何移動直至全部有序化线椰。

首先看下面的2個定義。對typedef的更多使用參考這里授药。

1.定義NSComparisonResult類型返回值
typedef NS_ENUM(NSInteger, NSComparisonResult)
{
    //代表升續(xù)
    NSOrderedAscending = -1L,    
    //代表相同
    NSOrderedSame,
    //代表降序                      
    NSOrderedDescending        
};

2.定義NSComparator block類型返回值
 typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

注意:NSArray的排序方法是生成一個排好序的新數(shù)組士嚎。NSMutableArray的排序可以直接對該數(shù)組進(jìn)行排序sortUsingComparator:,也可以生成新數(shù)組sortedArrayUsingComparator: 悔叽,而原數(shù)組不變莱衩。

1.使用block進(jìn)行排序(推薦使用)

NSMutableArray *arr = [NSMutableArray array];

[arr addObject:@2];
[arr addObject:@1];
[arr addObject:@5];
[arr addObject:@3];
[arr addObject:@4];

//此方法是直接對arr排序,若要生成新數(shù)組排序則調(diào)用sortedArrayUsingComparator:
//若明確知道數(shù)組中元素的類型娇澎,也可以直接將id改為某確定類型
[arr sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2)
{
    //此處的規(guī)則含義為:若前一元素比后一元素小笨蚁,則返回降序(即后一元素在前,為從大到小排列)
    if ([obj1 integerValue] < [obj2 integerValue])
    {
        return NSOrderedDescending;
    }
    else
    {
        return NSOrderedAscending;
    }
}];

排序結(jié)果為 5趟庄,4括细,3,2戚啥,1

2.使用SEL排序

NSMutableArray *arr = [NSMutableArray array];

for (NSInteger i = 0; i < 5; i++)
{
    Student *stu = [Student new];
    //生成10-20的隨機(jī)數(shù)
    stu.age = arc4random_uniform(10) + 10;
    [arr addObject:stu];
}

//此處的sel應(yīng)該理解為對數(shù)組中A對象調(diào)用自己的sel奋单,傳入值為B對象,同時返回值為NSComparisonResult
[arr sortUsingSelector:@selector(compareWithStu:)];

Student對象必須有一個自定義比較方法進(jìn)行排序猫十。此方法必須有一個傳入值(傳入Student對象用以比對)和一個返回值(NSComparisonResult類型)览濒。

Student具體如下

.h
@interface Student : NSObject
@property (assign, nonatomic) NSInteger age;
/** 排序規(guī)則*/
- (NSComparisonResult)compareWithStu:(Student *)stu;
@end

.m
@implementation Student
/** 排序規(guī)則*/
- (NSComparisonResult)compareWithStu:(Student *)stu
{
    //按照升續(xù)排列
    if (self.age > stu.age)
    {
        return NSOrderedDescending;
    }
    else if (self.age == stu.age)
    {
        return NSOrderedSame;
    }
    else
    {
       return NSOrderedAscending;
    }
}
@end

某次運(yùn)行結(jié)果為
(
    "age -> 10",
    "age -> 12",
    "age -> 12",
    "age -> 18",
    "age -> 19"
)

寫在最后:

1.排序是一個消耗性能的操作呆盖,應(yīng)盡量避免頻繁排序。
2.對于已經(jīng)排好序的數(shù)組再排序可以使用sortedArrayHint進(jìn)行性能優(yōu)化贷笛。在排序進(jìn)階篇會補(bǔ)上相關(guān)內(nèi)容应又。
3.對于數(shù)組中對象是NSString的排序推薦使用第二種方案,因為NSString已經(jīng)有了排序方案如compare:方法已經(jīng)是按照升序排列了乏苦。關(guān)于NSString的排序內(nèi)容很多株扛,另一篇填此坑。
4.對于排序還有一些高級用法汇荐,會在下一遍詳細(xì)說明洞就。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拢驾,隨后出現(xiàn)的幾起案子奖磁,更是在濱河造成了極大的恐慌,老刑警劉巖繁疤,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咖为,死亡現(xiàn)場離奇詭異,居然都是意外死亡稠腊,警方通過查閱死者的電腦和手機(jī)躁染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來架忌,“玉大人吞彤,你說我怎么就攤上這事√痉牛” “怎么了饰恕?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長井仰。 經(jīng)常有香客問我埋嵌,道長,這世上最難降的妖魔是什么俱恶? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任雹嗦,我火速辦了婚禮,結(jié)果婚禮上合是,老公的妹妹穿的比我還像新娘了罪。我一直安慰自己,他們只是感情好聪全,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布泊藕。 她就那樣靜靜地躺著,像睡著了一般难礼。 火紅的嫁衣襯著肌膚如雪娃圆。 梳的紋絲不亂的頭發(fā)上苞轿,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天仿畸,我揣著相機(jī)與錄音吹榴,去河邊找鬼唇撬。 笑死瓜喇,一個胖子當(dāng)著我的面吹牛吊趾,可吹牛的內(nèi)容都是我干的茬斧。 我是一名探鬼主播威蕉,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吧寺,長吁一口氣:“原來是場噩夢啊……” “哼窜管!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稚机,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤幕帆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赖条,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體失乾,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年纬乍,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱茁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡仿贬,死狀恐怖纽竣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茧泪,我是刑警寧澤蜓氨,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站队伟,受9級特大地震影響穴吹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缰泡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一刀荒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棘钞,春花似錦缠借、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姨拥,卻和暖如春绅喉,著一層夾襖步出監(jiān)牢的瞬間渠鸽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工柴罐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徽缚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓革屠,卻偏偏與公主長得像凿试,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子似芝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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

  • 數(shù)組可對其中包含的元素進(jìn)行排序那婉。 在排序前,我們需要定義一個Model類党瓮,將Model類對象添加至數(shù)組中详炬。 定義一...
    SkyMing一C閱讀 10,906評論 0 15
  • 1、NSSortDescriptor排序 概述: 數(shù)組是有序容器,因此集合中只有數(shù)組才能排序寞奸。該類能夠方便的實現(xiàn)對...
    lingxuemy閱讀 1,559評論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉呛谜,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 日常項目中偶爾會有用到要對接收到數(shù)據(jù)進(jìn)行排序操作。如果采用遍歷等方法來進(jìn)行不免寫大量代碼而且復(fù)用性很低枪萄,在這里記錄...
    一路向北客閱讀 3,044評論 0 1
  • 1.倒序 在ios開發(fā)的過程中呻率,經(jīng)常需要使數(shù)組中的數(shù)據(jù)倒敘排列!比如在tableView顯示數(shù)據(jù)的時候需要使數(shù)據(jù)倒...
    ChinaGoodStaff閱讀 31,762評論 5 36