実装の流れ(NSMutableArrayの配列編)
NSOutlineViewを表す場合、NSDictonaryなどを使って、木構造をとることが多いので、その例を使って整列を行うメソッドの例を挙げておきます。以下は、itemがchildというキーでNSMutableArrayを持つ場合の例です。子を整列した後、孫について再起呼出しを行っています。
- (void)sort:(NSDictionary*)item by:(NSString*)identifier order:(BOOL)order { NSMutableArray* children = [item objectForKey:@"child"]; if (!children) return; if (order) //昇順でソートします [children sortUsingFunction:compare context:identifier]; else //降順でソートします [children sortUsingFunction:compareReverce context:identifier]; NSEnumerator* enumerator = [children objectEnumerator]; NSDictionary* dict; while (dict = [enumerator nextObject]) { [self sort:dict by:identifier order:order]; } }
sortUsingFunctionの第一引数は関数ポインタで、配列の際に、比較する回数だけ何度も呼び出されます。なので比較関数はなるべく軽くしておいたほうがいいでしょう(下の例のようにcompareメソッドを使うにしても、メッセージじゃなくてポインタを使うとか)。あまり大きなデータに対しては試していないので、よくわかりませんが。
//昇順のソート static NSComparisonResult compare(id in1, id in2, void* inKind) { //NSString,NSDate,NSNumberのcompareメソッドを使って比較します。 return [[in1 objectForKey:inKind] compare:[in2 objectForKey:inKind]]; } //降順のソート static NSComparisonResult compareReverce(id in1, id in2, void* inKind) { return compare(in2,in1,inKind); }
ちなみにFinderのソートの方法はUTF-16を使っている(NSStringはUTF-8)ので、http://developer.apple.com/ja/qa/qa2004/qa1159.htmlのようにして、Finderと同質のソートを行うことも可能です。