我們開發的每個程序都會使用到一些數據,而這些數據一般被封裝在一個自定義的類中。例如一個音樂程序可能會有一個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。
原文http://mobile.51cto.com/hot-434804.htm