成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

[[110950]]

我們開發的每個程序都會使用到一些數據,而這些數據一般被封裝在一個自定義的類中。例如一個音樂程序可能會有一個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。

***,其實這里并沒有標準答案,你可以跟著自己的感覺走:]

責任編輯:閆佳明 來源: beyondvincent
相關推薦

2019-11-19 08:04:16

JavaHashSet去重

2010-03-01 11:10:41

WCF綁定元素

2013-06-27 11:10:01

iOS開發自定義UISlider

2022-10-09 08:35:06

SQL自定義排序

2022-06-06 09:01:16

SwiftUI自定義導航

2022-09-20 07:01:50

對象初始化代碼

2013-07-18 16:09:10

自定義iOS狀態欄iOS開發iOS學習

2024-01-05 15:28:06

鴻蒙數據同步GlobalThis

2021-11-23 15:06:42

Kubernetes 運維開源

2010-05-11 13:16:21

Unix awk

2011-08-02 11:17:13

iOS開發 View

2013-05-30 15:53:17

iOS開發iOS SDKPopver

2021-01-20 08:58:39

iOS 14桌面圖標快捷指令

2012-06-01 11:02:33

2017-10-25 14:07:54

APPiOSxcode

2009-08-03 16:37:49

C#異常類

2009-11-25 14:36:39

PHP函數usort(

2009-11-12 16:14:28

ADO.NET自定義對

2011-06-15 09:24:36

Qt Widget Model

2014-12-30 11:51:35

ListViewItem View
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频在线免费 | 激情欧美一区二区三区 | 亚洲成人免费视频在线观看 | 日韩av网址在线观看 | 极品粉嫩国产48尤物在线播放 | 91手机精品视频 | 久久一热 | 国产精品久久二区 | 日韩中文字幕网 | 男人的天堂久久 | 一区二区三区av夏目彩春 | 国产高潮好爽受不了了夜夜做 | 精品一区二区三区在线观看国产 | 国产精品久久久乱弄 | 国产精品一区二区三区免费观看 | 国产精品视频久久久久久 | 久久久久国产 | 超碰伊人久久 | 国产在线精品一区二区 | 99久久精品免费 | 91av视频在线观看 | 精品日韩 | 久久99精品久久久久久国产越南 | 日本精品视频 | 国产欧美日韩精品在线观看 | 亚洲色视频 | 国产欧美日韩在线观看 | 日韩视频一区二区在线 | 97国产精品视频人人做人人爱 | 亚洲一区在线日韩在线深爱 | 一区二区三区在线播放视频 | 国产欧美精品在线观看 | 欧美国产中文字幕 | 天天色图 | 日韩精品亚洲专区在线观看 | 涩涩片影院 | 精品中文在线 | 在线免费观看色 | 一区二区在线不卡 | 一区二区三区成人 | 国产精品视频久久久 |