iOS中對NSArray中自定義的物件進行排序
我們開發的每個程式都會使用到一些資料,而這些資料一般被封裝在一個自定義的類中。例如一個音樂程式可能會有一個Song類,聊天程式則又一個 Friend類,點菜程式會有一個Recipe類等。有時候我們希望在程式中顯示的列表資料是按照一定順序進行排列的,本文我們就來看看在iOS中有哪些 方法可以對NSArray中的物件進行排序。下面是目錄:
- 小引
- 使用NSComparator進行排序
- 使用NSDescriptor進行排序
- 使用selector進行排序
小引
我們將要排序的物件是一個Persion類,如下定義:
@interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *surname; @property (nonatomic, strong) NSDate *dateOfBirth; @end
而陣列中包含如下內容:
Smith John 03/01/1984 Andersen Jane 16/03/1979 Clark Anne 13/09/1995 Smith David 19/07/1981 Johnson Rose 22/02/1989
使用NSComparator進行排序
comparator實際上是用一個block物件作比較操作。它的定義如下所示:
typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
上面的引數(obj1、obj2)就是我們將要做比較的物件。block返回的結果為NSComparisonResult型別來表示兩個物件的順序。
要對整個陣列做排序,則需要使用NSArray的sortArrayUsingComparator:方法,如下程式碼所示:
NSArray *sortedArray = [self.persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2){ return [p1.surname compare:p2.surname]; }];
最終排序的結果如下所示:
Andersen Jane Clark Anne Johnson Rose Smith John Smith David
使用NSDescriptor進行排序
Sort descriptor不僅可以用來對陣列進行排序,還能指定element在table view中的排序,以及Core Data中對fetch request返回的資料做排序處理。通過sort descriptor可以很方便的對陣列進行多個key的排序。下面來看看如何對我們的陣列做surname排序,然後在進行name排序:
NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"surname" ascending:YES]; NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil]; NSArray *sortedArray = [self.persons sortedArrayUsingDescriptors:sortDescriptors];
上面程式碼的排序結果如下所示:
Andersen Jane Clark Anne Johnson Rose Smith David Smith John
使用selector進行排序
當面,我們也可以定義自己的方法進行兩個物件做比較,並將該方法用於陣列排序。comparator訊息會被髮送到數值中的每個物件中,並攜帶陣列中另外的一個物件當做引數。自定義的的方法的返回結果是這樣的:如果本身物件小於引數中的物件,就返回NSOrederedAscending,相反,則返回NSOrderedDescending,如果相等,那麼返回NSOrderedSame。如下程式碼所示:
- (NSComparisonResult)compare:(Person *)otherPerson { return [self.dateOfBirth compare:otherPerson.dateOfBirth]; }
這個方法定義在Person類中,用來對person的生日進行排序。
上面所介紹的這些方法都是為了完成相同的事情:對陣列做排序處理,你可能在想改選擇使用哪個呢?當需要通過多個key進行排序,那麼最簡單的方法就 是使用sort descriptor。如果比較方法很複雜的話,建議在使用外面自己的selector。Block是再iOS 4之後引入的一個強大功能,用block作比較,可以不必使用任何的變數就能完成一個簡單的比較方法,當然,你也可以定義一個複雜的block,來替換 selector。
相關文章
- 按照NSArray內部的某個物件排序物件排序
- Java 對映 自定義排序Java排序
- 如何在Python中對dicts列表進行排序Python排序
- Python實用技法第13篇:對自定義類物件排序:attrgetterPython物件排序
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- 想在 KubeSphere 中進行自定義監控?來瞧瞧這
- 如何在dhtmlxGantt網格中對任務進行排序和重新排序HTML排序
- 自定義物件池在 Caffeine 框架中實踐物件框架
- 在Luminar 4中向天空新增自定義物件物件
- SpringBoot中,如何把自定義的yml配置檔案中的內容和對應類的bean物件取出Spring BootBean物件
- ios自定義圓環進度條iOS
- 對字典進行排序排序
- linux 中awk命令實現按照 指定的字元對文字進行排序Linux字元排序
- Python自定義排序Python排序
- MySQL自定義排序MySql排序
- Oracle 中,根據狀態欄位進行自定義排序例(待驗證、待維修、重新維修)Oracle排序
- Javascript中的陣列物件排序JavaScript陣列物件排序
- 直播app開發,對字串中字元進行自然順序排序APP字串字元排序
- Python對字典進行排序Python排序
- python 對字典的值進行排序Python排序
- Android自定義view中,onDraw和onLayout對比AndroidView
- Python進階:自定義物件實現切片功能Python物件
- iOS 自定義 UISlider 的 trackRectiOSUIIDE
- 自定義Map集合,將重複的鍵值對不進行覆蓋而是進行疊加
- JavaScript 根據物件鍵值進行排序JavaScript物件排序
- 「Js」物件按照鍵名來進行排序JS物件排序
- Vue 中「自定義指令」的魅力Vue
- Vue中自定義指令Vue
- Javascript中自定義事件JavaScript事件
- [iOS] [OC] NSNotificationCenter 進階及自定義(附原始碼)iOS原始碼
- iOS-對圖片操作---新增到自定義相簿iOS
- Java 列表元素自定義排序Java排序
- js:陣列自定義排序JS陣列排序
- python-進階教程-使用物件屬性進行排序Python物件排序
- 1.17 另一個自定義的CVCalendar日曆 [iOS開發中的神兵利器]iOS
- Laravel 5.5 以下版本中自定義日誌行為Laravel
- 使用Collections對list的內容進行排序排序
- Kotlin中的Ranges以及自定義RangeKotlin
- iOS 中的 block 是如何持有物件的iOSBloC物件