web-dev-qa-db-ja.com

NSStringのNSArrayの並べ替え

NSMutableArrayをソートするためのコードを誰かに見せてもらえますか?私は次のNSMutableArrayを持っています:

NSMutableArray *arr = [[NSMutableArray alloc] init];

「2」、「4」、「5」、「1」、「9」など、すべてNSStringである要素を使用します。

最大値の整数がリストの中で最も高くなるように(インデックス0)、リストを降順でソートしたいと思います。

私は以下を試しました:

[arr sortUsingSelector:@selector(compare:)];

しかし、それは私の値を適切にソートしていないようでした。

誰かが私が達成しようとしていることを適切に行うためのコードを見せてもらえますか?ありがとう!

21
CodeGuy

文字列の独自の比較メソッドを作成するのは非常に簡単です。

@implementation NSString(compare)

-(NSComparisonResult)compareNumberStrings:(NSString *)str {
    NSNumber * me = [NSNumber numberWithInt:[self intValue]];
    NSNumber * you = [NSNumber numberWithInt:[str intValue]];

    return [you compare:me];
}

@end
19
thelaws

この方法を使用する必要があります。

[arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

NSArrayまたは:

[arr sortUsingSelector:@selector(caseInsensitiveCompare:)];

「インプレース」ソートでNSMutableArray

コンパレータは次のいずれかの値を返す必要があります。

  • NSOrderedAscending
  • NSOrderedDescending
  • NSOrderedSame
57
HyLian

配列の要素が数字を含み文字を含まないNSStringである場合(つまり、「8」、「25」、「3」など)、実際に機能するクリーンで短い方法は次のとおりです。

NSArray *sortedArray = [unorderedArray sortedArrayUsingComparator:^(id a, id b) {
    return [a compare:b options:NSNumericSearch];
}];

完了! NSComparisonResultを返すメソッド全体、またはNSSortDescriptor ..の8行を記述する必要はありません。

18
Eric

私見、そのような配列をソートする最も簡単な方法は

[arr sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self.intValue" ascending:YES]]]

配列にfloat値が含まれている場合は、キーをself.floatValueまたはself.doubleValueに変更するだけです。

5
ReDetection

最も簡単な方法は、このようなコンパレータメソッドを作成することです。

NSArray *sortedStrings = [stringsArray sortedArrayUsingComparator:^NSComparisonResult(NSString *firstString, NSString *secondString) {
    return [[firstString lowercaseString] compare:[secondString lowercaseString]];
}];
2
albertosh