iOS探索:對NSArray中自訂的對象進行排序

來源:互聯網
上載者:User

標籤:

本文譯自How to sort NSArray with custom objects。

 

我們開發的每個程式都會使用到一些資料,而這些資料一般被封裝在一個自訂的類中。例如一個音樂程式可能會有一個Song類,聊天程式則又一個 Friend類,點菜程式會有一個Recipe類等。有時候我們希望在程式中顯示的列表資料是按照一定順序進行排列的,本文我們就來看看在iOS中有哪些 方法可以對NSArray中的對象進行排序。下面是目錄:

  • 小引
  • 使用NSComparator進行排序
  • 使用NSDescriptor進行排序
  • 使用selector進行排序
小引

我們將要排序的對象是一個Persion類,如下定義:

  1. @interface Person : NSObject 
  2. @property (nonatomic, copy) NSString *name; 
  3. @property (nonatomic, copy) NSString *surname; 
  4. @property (nonatomic, strong) NSDate *dateOfBirth; 
  5. @end 

而數組中包含如下內容:

  1. Smith John 03/01/1984 
  2. Andersen Jane 16/03/1979 
  3. Clark Anne 13/09/1995 
  4. Smith David 19/07/1981 
  5. Johnson Rose 22/02/1989 
使用NSComparator進行排序

comparator實際上是用一個block對象作比較操作。它的定義如下所示:

  1. typedef NSComparisonResult (^NSComparator)(id obj1, id obj2); 

上面的參數(obj1、obj2)就是我們將要做比較的對象。block返回的結果為NSComparisonResult類型來表示兩個對象的順序。

要對整個數組做排序,則需要使用NSArray的sortArrayUsingComparator:方法,如下代碼所示:

  1. NSArray *sortedArray = [self.persons sortedArrayUsingComparator:^NSComparisonResult(Person *p1, Person *p2){ 
  2.     return [p1.surname compare:p2.surname]; 
  3. }]; 

最終排序的結果如下所示:

  1. Andersen Jane 
  2. Clark Anne 
  3. Johnson Rose 
  4. Smith John 
  5. Smith David 
使用NSDescriptor進行排序

Sort descriptor不僅可以用來對數組進行排序,還能指定element在table view中的排序,以及Core Data中對fetch request返回的資料做排序處理。通過sort descriptor可以很方便的對數組進行多個key的排序。下面來看看如何對我們的數組做surname排序,然後在進行name排序:

  1. NSSortDescriptor *firstDescriptor = [[NSSortDescriptor alloc] initWithKey:@"surname" ascending:YES]; 
  2. NSSortDescriptor *secondDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
  3.  
  4. NSArray *sortDescriptors = [NSArray arrayWithObjects:firstDescriptor, secondDescriptor, nil]; 
  5.  
  6. NSArray *sortedArray = [self.persons sortedArrayUsingDescriptors:sortDescriptors]; 

上面代碼的排序結果如下所示:

  1. Andersen Jane 
  2. Clark Anne 
  3. Johnson Rose 
  4. Smith David 
  5. Smith John 
使用selector進行排序

當面,我們也可以定義自己的方法進行兩個對象做比較,並將該方法用於數組排序。comparator訊息會被發送到數值中的每個對象中,並攜帶數組中另外的一個對象當做參數。自訂的的方法的返回結果是這樣的:如果本身對象小於參數中的對象,就返回NSOrederedAscending,相反,則返回NSOrderedDescending,如果相等,那麼返回NSOrderedSame。如下代碼所示:

  1. - (NSComparisonResult)compare:(Person *)otherPerson { 
  2.     return [self.dateOfBirth compare:otherPerson.dateOfBirth]; 

這個方法定義在Person類中,用來對person的生日進行排序。

上面所介紹的這些方法都是為了完成相同的事情:對數組做排序處理,你可能在想改選擇使用哪個呢?當需要通過多個key進行排序,那麼最簡單的方法就 是使用sort descriptor。如果比較方法很複雜的話,建議在使用外面自己的selector。Block是再iOS 4之後引入的一個強大功能,用block作比較,可以不必使用任何的變數就能完成一個簡單的比較方法,當然,你也可以定義一個複雜的block,來替換 selector。

最後,其實這裡並沒有標準答案,你可以跟著自己的感覺走:]

iOS探索:對NSArray中自訂的對象進行排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.