2011年8月11日

NSArray排序筆記

本來以為這種功能要自己實做的
沒想到iOS SDK關於array的排序還挺簡單的
整理幾個基本的常用用法:
1.字串(NSString)、日期(NSDate)排序
2.使用NSSortDescriptor達到降冪排序
3.元素為自訂物件的排序

1.字串、日期排序

[DataArr sortedArrayUsingSelector:@selector(compare:)]
可用在有現成比較函式class,如NSString或NSDate
如上例應用在NSString的compare:會輸出升冪排序
自訂物件的話應該也可以自行imperment 函式來比較物件
但有更簡單的方式,可參考第三項


2.使用NSSortDescriptor達到降冪排序
第一點中輸出的排序預設為升冪排序,要改成降冪可運用NSSortDescriptor
NSSortDescriptor可運用在以下情形:排序陣列、比較物件、決定table view、array controller等資料順序的編排(參考自官方文件
NSSortDescriptor *SortDescriptor=[NSSortDescriptor sortDescriptorWithKey:Nil ascending:NO selector:@selector(compare:)];
DataArr=[DataArr sortedArrayUsingDescriptors:[NSArray arrayWithObject:SortDescriptor]];
如此便可得到一個降冪排序過的 DataArr
 
3.元素為自訂物件的排序
比較複雜的狀況是array每個元素是自己建立的interface或其他資料結構,
卻想針對某個特定屬性來排序
例如array中有很多本書,想對每本書的出版日期做排序
NSSortDescriptor *sortDescriptor=[[NSSortDescriptor alloc]initWithKey:@"date" ascending:isAscending];
NSArray *sortDescriptors=[NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArr=[arr sortedArrayUsingDescriptors:sortDescriptors];
比較神奇的是initWithKey:@"date"的地方,在這兩種情形都可以用:
  • obj.date
  • obj是個NSDictionary,date為obj的key
參考自:http://stackoverflow.com/questions/805547/how-to-sort-an-nsmutablearray-with-custom-objects-in-it

雖然NSArray、NSSortDescriptor的class reference看起來還有很多厲害的用法
但這三個範例應該就可以處理掉很多排序的例子了

沒有留言: