咱們開發的每一個程序都會使用到一些數據,而這些數據通常被封裝在一個自定義的類中。例如一個音樂程序可能會有一個Song類,聊天程序則又一個 Friend類,點菜程序會有一個Recipe類等。有時候咱們但願在程序中顯示的列表數據是按照必定順序進行排列的,本文咱們就來看看在iOS中有哪些 方法能夠對NSArray中的對象進行排序。下面是目錄:數組
- 小引
- 使用NSComparator進行排序
- 使用NSDescriptor進行排序
- 使用selector進行排序
小引
咱們將要排序的對象是一個Persion類,以下定義:fetch
- @interface Person : NSObject
- @property (nonatomic, copy) NSString *name;
- @property (nonatomic, copy) NSString *surname;
- @property (nonatomic, strong) NSDate *dateOfBirth;
- @end
而數組中包含以下內容:atom
- 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對象做比較操做。它的定義以下所示:spa
- typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
上面的參數(obj一、obj2)就是咱們將要作比較的對象。block返回的結果爲NSComparisonResult類型來表示兩個對象的順序。htm
要對整個數組作排序,則須要使用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排序:ip
- 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];
上面代碼的排序結果以下所示:ci
- Andersen Jane
- Clark Anne
- Johnson Rose
- Smith David
- Smith John
使用selector進行排序
當面,咱們也能夠定義本身的方法進行兩個對象作比較,並將該方法用於數組排序。comparator消息會被髮送到數值中的每一個對象中,並攜帶數組 中另外的一個對象當作參數。自定義的的方法的返回結果是這樣的:若是自己對象小於參數中的對象,就返回NSOrederedAscending,相反,則 返回NSOrderedDescending,若是相等,那麼返回NSOrderedSame。以下代碼所示:element
- - (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