私は高得点表を作成し、Objective Cの配列を吸い込もうとしています(実際、一般にObjective Cは私にとってやりがいがあります)。私はこのようなことをしようとしています(擬似コード、私はより快適だから、これをactionscriptスタイルで書いています):
highscores.addObjecttoArray(score)
highscores.sort(ascending)
しかし、私はそれを理解することはできません...私はそれについて他のスレッドを見ましたが、それらはplistファイルなどを使用しており、それらから学ぶのに十分なObjective Cを知りません。
あなたはそれを短い方法でやりたいですか?
NSNumber
インスタンスの可変配列がある場合:
NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];
素敵で簡単:)
不変配列の記述子を使用して同様のソートを実行することもできますが、インプレースソートの代わりにコピーが作成されます。
[highscores sortUsingSelector:@selector(compare:)];
確実にすべてNSNumber
sである場合に機能するはずです。
(オブジェクトの追加は次のとおりです。
_[highscores addObject:score];
_
)
降順(最上位)でソートする場合:
10.6/iOS 4:
_[highscores sortUsingComparator:^(id obj1, id obj2) {
if (obj1 > obj2)
return NSOrderedAscending;
else if (obj1 < obj2)
return NSOrderedDescending;
return NSOrderedSame;
}];
_
それ以外の場合は、カテゴリメソッドを定義できます。例:
_@interface NSNumber (CustomSorting)
- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber;
@end
@implementation NSMutableArray (CustomSorting)
- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber {
return [otherNumber compare:self];
}
@end
_
そしてそれを呼び出す:
[highscores sortUsingSelector:@selector(reverseCompare:)];
Ohhorobが提供する答えを試しましたが、オブジェクトはまだアルファベット順にソートされていました。次に、別の答えでこれに遭遇しました( https://stackoverflow.com/a/4550451/823356 ):
NSSortDescriptorを変更すると、数値順にソートされるようになりました。
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score"
ascending:YES
comparator:^(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
「NSNumbersのアルファベット順のソート」問題を解決したので、ここにドロップすると思いました
それが価値があるすべてのために、ここに別の速記方法があります:
NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5];
NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
return [n1 compare:n2];
}];
NSLog(@"Ascending: %@", asc);
NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) {
return [n2 compare:n1];
}];
NSLog(@"Descending: %@", dec);
このコードは、NSNumberのNSMutableArrayを昇順で並べ替えます。
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
このコードは、NSNumberのNSMutableArrayを降順に並べ替えます。
[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2] * -1; // reverse the enum
}];
このコードは、NSNumber compare:メソッドが-1〜1の範囲のNSComparisonResultを返すという事実を使用します。比較の結果に-1を掛けると、結果が逆になり、並べ替えが降順になります。
距離はキーであり、その値のリンク(floatまたはdouble)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance"
ascending:YES
comparator:^(id obj1, id obj2)
{
return [obj1 compare:obj2 options:NSNumericSearch];
}];
NSArray *myArray = [NSArray arrayWithArray:arraySubCat];
myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]];
arraySubCat = [myArray copy];