NSArray に NSString があり、重要度に基づいてこの文字列/フィールドを並べ替えたいと考えていました。つまり、文字列が B、H、A、Q、Z、L、M、O であるとします。
常に A、Q、Z、B、H、O、L、M の順に並べ替えたいと思いました。これは事前定義された一連のルールです。どうすればいいですか?これは NSSortDescriptor を使用して実行できますか?
NSArray に NSString があり、重要度に基づいてこの文字列/フィールドを並べ替えたいと考えていました。つまり、文字列が B、H、A、Q、Z、L、M、O であるとします。
常に A、Q、Z、B、H、O、L、M の順に並べ替えたいと思いました。これは事前定義された一連のルールです。どうすればいいですか?これは NSSortDescriptor を使用して実行できますか?
簡単な答え: はい!
そして、これが方法です...
値について知っておく必要がある 2 つの情報 (重要度と値自体) があるため、これら 2 つの重要な情報を含むオブジェクトを作成し、文字列を格納するのと同様の方法で配列に格納する必要があります。これにより、たとえば、後で「重要度」を変更したい場合に、ほとんど手間をかけずに簡単に行うことができます。
@interface MyObject : NSObject
@property (nonatomic, readwrite) NSInteger sortOrder;
@property (nonatomic, retain) NSString *value;
@end
@implementation MyObject
@synthesize sortOrder;
@synthesize value;
-(NSString *)description
{
//...so I can see the values in console should I NSLog() it
return [NSString stringWithFormat:@"sortOrder=%i, value=%@", self.sortOrder, self.value];
}
-(void)dealloc
{
self.value = nil;
[super dealloc];
}
@end
オブジェクトを配列に追加します。次に並べ替えます。
NSMutableArray *myArrayOfObjects = [NSMutableArray array];
//Add your objects
MyObject *obj = [[[MyObject alloc] init] autorelease];
obj.sortOrder = 1;
obj.value = @"A";
[myArrayOfObjects addObject:obj];
obj = [[[MyObject alloc] init] autorelease];
obj.sortOrder = 2;
obj.value = @"Q";
[myArrayOfObjects addObject:obj];
//Sort the objects according to importance (sortOrder in this case)
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES] autorelease];
NSArray *sortedArray = [myArrayOfObjects sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSLog(sortedArray); //<--See for yourself that they are sorted
NSArray にはいくつかのソート機能があります。考えられるのは次の 3 つです。
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context
2 番目のセレクター ベースのコンパレーターが、使い始めるのに最も使いやすいと思うかもしれません。ここのドキュメントを参照してください:
編集:
NSSortDescriptor を使用するのはやり過ぎかもしれませんが、これについて説明した良い投稿があります。