NSArray 内のオブジェクトの指定したメンバ変数でソートする方法です。
NSArray に複数の Book クラスが入っているとします。Book クラスは以下のようなメンバ変数を持っています。
@interface Book: NSObject {
NSInteger no;
NSString* furigana;
NSDate* publish_date;
}
ソートするには NSArray 内のオブジェクトに NSComparisonResult を返すメソッドを作り、そのメソッド内で比較をします。
数値でのソート
数値での比較は単純に比較をしてその結果により NSComparisonResult を返します。下記の例は降順にソートしています。昇順にソートしたいときは NSOrderedAscending と NSOrderedDescending を逆にすれば OK です。
- (NSComparisonResult) compareNo:(Book*)_book {
if (self.no > book.no) {
return NSOrderedAscending;
} else if (self.no < _book.no) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}
ソートするときには以下のようにします。
books = [books sortedArrayUsingSelector:@selector(compareNo:)];
文字でのソート
文字でのソートは NSString クラスの localizedCaseInsensitiveCompare: を使用します。localizedCompare: でもかまいませんが、localizedCaseInsensitiveCompare: の方は大文字、小文字を区別せずに辞書的なソートをしてくれます。
- (NSComparisonResult) compareFurigana:(Book*)_book {
return [self.furigana localizedCaseInsensitiveCompare:_book.furigana];
}
日付でのソート
日付でのソートは NSDate の compare: を使用します。昇順、降順は self.publish_date と _book.publish_date を入れ替えれば変えられます。
- (NSComparisonResult) comparePublishDate:(Book*)_book {
return [self.publish_date compare:_book.publish_date];
}
追記 [ 9/13 ]
@erguolinge さんに twitter で sortedArrayUsingDescriptors: を使えばもっと簡単にソートできることを教えていただきました。以下の記事をご参考ください。ありがとうございました!
蒼い惑星: NSArrayのソート方法について
関連する投稿
5 Responses to “[iPhone] NSArray のソート方法”
Leave a Reply
Additional comments powered by BackType
9月 10th, 2010 at 4:40 pm
[blog] [iPhone] NSArray のソート方法 http://is.gd/f3Iwo
This comment was originally posted on Twitter
9月 10th, 2010 at 10:38 pm
Sun Limited Mt. – [iPhone] NSArray のソート方法 http://www.syuhari.jp/blog/archives/2231
This comment was originally posted on Twitter
9月 11th, 2010 at 10:16 am
メモ、後で読みます! “@syuhari: [blog] [iPhone] NSArray のソート方法 http://is.gd/f3Iwo”
This comment was originally posted on Twitter
10月 4th, 2010 at 6:56 am
[...] http://www.syuhari.jp/blog/archives/2231#more-2231 [...]
2月 27th, 2011 at 11:04 pm
[...] 独自クラスをソート [...]