2010-09-12

NSArrayのソート方法について

「NSArray内のオブジェクトの指定したメンバー変数でソートする方法」の話しです。
@syuhariさんの記事も参考しました。
[iPhone] NSArray のソート方法

確かに出来ましたが、なんか面倒な気がしますね。
別の方法がないかと思って、調べると、sortedArrayUsingDescriptorsを使うと、より楽になりそうです。

下記の属性を持っているTaskを格納するNSArrayとします。

  1. @property (nonatomic, retain) NSNumber *dispNumber;  
  2. @property (nonatomic, retain) NSString *text;  
  3. @property (nonatomic, retain) NSDate *dueDate;  


データを用意する


  1. NSMutableArray *testArray = [NSMutableArray array];  
  2.   
  3. Task *task1 = [[Task alloc] init];  
  4. task1.dispNumber = [NSNumber numberWithInt:1];  
  5. task1.text = @"D";  
  6. task1.dueDate = [NSDate dateWithTimeIntervalSince1970:400000];  
  7. [testArray addObject:task1];  
  8. Task *task2 = [[Task alloc] init];  
  9. task2.dispNumber = [NSNumber numberWithInt:1];  
  10. task2.text = @"A";  
  11. task2.dueDate = [NSDate dateWithTimeIntervalSince1970:200000];  
  12. [testArray addObject:task2];  
  13. Task *task3 = [[Task alloc] init];  
  14. task3.dispNumber = [NSNumber numberWithInt:2];  
  15. task3.text = @"E";  
  16. task3.dueDate = [NSDate dateWithTimeIntervalSince1970:100000];  
  17. [testArray addObject:task3];  
  18. Task *task4 = [[Task alloc] init];  
  19. task4.dispNumber = [NSNumber numberWithInt:4];  
  20. task4.text = @"C";  
  21. Task *task5 = [[Task alloc] init];  
  22. task5.dispNumber = [NSNumber numberWithInt:1];  
  23. task5.text = @"B";  
  24. task5.dueDate = [NSDate dateWithTimeIntervalSince1970:500000];  
  25. [testArray addObject:task5];  

ソートを実行する
  1. NSSortDescriptor *sortDispNo = [[NSSortDescriptor alloc] initWithKey:@"dispNumber" ascending:YES];  
  2. NSSortDescriptor *sortText = [[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO];  
  3. NSArray *sortDescArray = [NSArray arrayWithObjects:sortDispNo, sortText, nil];  
  4.   
  5. [testArray sortedArrayUsingDescriptors:sortDescArray];  

実行結果は、こうなっています。
  1. 2010-09-12 16:24:57.096 ArraySortTest[624:207] ソート前  
  2. 2010-09-12 16:24:57.098 ArraySortTest[624:207] DispNo : 1 Text : D DueDate : 0045-01-05 15:06:40 GMT  
  3. 2010-09-12 16:24:57.099 ArraySortTest[624:207] DispNo : 1 Text : A DueDate : 0045-01-03 07:33:20 GMT  
  4. 2010-09-12 16:24:57.099 ArraySortTest[624:207] DispNo : 2 Text : E DueDate : 0045-01-02 03:46:40 GMT  
  5. 2010-09-12 16:24:57.100 ArraySortTest[624:207] DispNo : 4 Text : C DueDate : 0045-01-04 11:20:00 GMT  
  6. 2010-09-12 16:24:57.101 ArraySortTest[624:207] DispNo : 1 Text : B DueDate : 0045-01-06 18:53:20 GMT  
  7. 2010-09-12 16:24:57.101 ArraySortTest[624:207] ソート後  
  8. 2010-09-12 16:24:57.102 ArraySortTest[624:207] DispNo : 1 Text : D DueDate : 0045-01-05 15:06:40 GMT  
  9. 2010-09-12 16:24:57.102 ArraySortTest[624:207] DispNo : 1 Text : B DueDate : 0045-01-06 18:53:20 GMT  
  10. 2010-09-12 16:24:57.107 ArraySortTest[624:207] DispNo : 1 Text : A DueDate : 0045-01-03 07:33:20 GMT  
  11. 2010-09-12 16:24:57.108 ArraySortTest[624:207] DispNo : 2 Text : E DueDate : 0045-01-02 03:46:40 GMT  
  12. 2010-09-12 16:24:57.109 ArraySortTest[624:207] DispNo : 4 Text : C DueDate : 0045-01-04 11:20:00 GMT  

1 件のコメント:

匿名 さんのコメント...

参考になりました!すばらしい投稿をありがとうございます!