web-dev-qa-db-ja.com

NSMutableArrayに数値を並べ替えるにはどうすればよいですか?

私は高得点表を作成し、Objective Cの配列を吸い込もうとしています(実際、一般にObjective Cは私にとってやりがいがあります)。私はこのようなことをしようとしています(擬似コード、私はより快適だから、これをactionscriptスタイルで書いています):

highscores.addObjecttoArray(score)
highscores.sort(ascending)

しかし、私はそれを理解することはできません...私はそれについて他のスレッドを見ましたが、それらはplistファイルなどを使用しており、それらから学ぶのに十分なObjective Cを知りません。

49
meman32

あなたはそれを短い方法でやりたいですか?

NSNumberインスタンスの可変配列がある場合:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];

素敵で簡単:)

不変配列の記述子を使用して同様のソートを実行することもできますが、インプレースソートの代わりにコピーが作成されます。

137
ohhorob

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

確実にすべてNSNumbersである場合に機能するはずです。

(オブジェクトの追加は次のとおりです。

_[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:)];

27
Wevah

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のアルファベット順のソート」問題を解決したので、ここにドロップすると思いました

3

それが価値があるすべてのために、ここに別の速記方法があります:

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);
2
Mike M

このコードは、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を掛けると、結果が逆になり、並べ替えが降順になります。

0
user3641723

距離はキーであり、その値のリンク(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];
0
Rahul Patel