2010-09-12

NSArrayのソート方法について

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

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

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

@property (nonatomic, retain) NSNumber *dispNumber;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *dueDate;


データを用意する


NSMutableArray *testArray = [NSMutableArray array];

Task *task1 = [[Task alloc] init];
task1.dispNumber = [NSNumber numberWithInt:1];
task1.text = @"D";
task1.dueDate = [NSDate dateWithTimeIntervalSince1970:400000];
[testArray addObject:task1];
Task *task2 = [[Task alloc] init];
task2.dispNumber = [NSNumber numberWithInt:1];
task2.text = @"A";
task2.dueDate = [NSDate dateWithTimeIntervalSince1970:200000];
[testArray addObject:task2];
Task *task3 = [[Task alloc] init];
task3.dispNumber = [NSNumber numberWithInt:2];
task3.text = @"E";
task3.dueDate = [NSDate dateWithTimeIntervalSince1970:100000];
[testArray addObject:task3];
Task *task4 = [[Task alloc] init];
task4.dispNumber = [NSNumber numberWithInt:4];
task4.text = @"C";
Task *task5 = [[Task alloc] init];
task5.dispNumber = [NSNumber numberWithInt:1];
task5.text = @"B";
task5.dueDate = [NSDate dateWithTimeIntervalSince1970:500000];
[testArray addObject:task5];

ソートを実行する
NSSortDescriptor *sortDispNo = [[NSSortDescriptor alloc] initWithKey:@"dispNumber" ascending:YES];
NSSortDescriptor *sortText = [[NSSortDescriptor alloc] initWithKey:@"text" ascending:NO];
NSArray *sortDescArray = [NSArray arrayWithObjects:sortDispNo, sortText, nil];

[testArray sortedArrayUsingDescriptors:sortDescArray];

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

1 件のコメント:

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

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