2010-06-14

iPhoneアプリ開発: NSArrayを任意の比較方法でソート

NSArray の中身を任意の比較方法でソートする方法。

まず、配列要素となるクラスを作成し、仕込みを入れます。

//ArrayElement.h
#import <Foundation/Foundation.h>

@interface ArrayElement : NSObject {
 NSString *order;
}
@property (nonatomic, retain) NSString *order;
- (id)initWithOrder:(NSString *)order;
+ (NSArray *)sort;
@end


//ArrayElement.m
#import "ArrayElement.h"

@implementation ArrayElement
@synthesize order;

- (id)initWithOrder:(NSString *)aOrder {
 self = [super init];
 if (self != nil) {
  order = [aOrder copy];
 }
 return self;
}

- (NSComparisonResult)compare:(ArrayElement *)anotherArrayElement {
 //self と anotherArrayElement を比較
 NSComparisonResult result = [self.order compare:anotherArrayElement.order];

 //降順
 if (result == NSOrderedAscending) return NSOrderedDescending;
 else if (result == NSOrderedDescending) return NSOrderedAscending;
 else return NSOrderedSame;
}

+ (NSArray *)sort:(NSArray *)originalArray {
 return (NSArray *)[originalArray sortedArrayUsingSelector:@selector(compare:)];
}

使い方は次の通り。
NSArray *sortedArray = [ArrayElement sort:originalArray];
このサンプルコードでは、 originalArray に格納されている ArrayElement インスタンスが各々もつ変数 order を比較して、降順に並べ替えられた後の ArrayElement インスタンスの配列が、 sortedArray に格納されます。

オリジナルのソートをするためには、ArrayElementのcompareメソッド内で、self と 引数 anotherArrayElement を比較する箇所を独自の実装にして、適切に
  • NSOrderedDescending (self より anotherArrayElement の方が小さい)
  • NSOrderedAscending (self より anotherArrayElement の方が大きい)
  • NSOrderedSame (self と anotherArrayElement は同じ)
を return します。

0 件のコメント: