1

NSArray のインデックス 1 の値に関して、NSArray を持つ NSMutableArray をソートしたいと考えています。配列の絵を描いてみます。

NSMutableArray *ultimateHighscoreArray = { 
    ( (NSString) userName, (double) score, (int) numOfCorrectAnswers ) , 
      ( John , 4.5 , 3 ) , 
      ( Terry , 7.5 , 1) , 
                                     ... }

NSMutableArray 内の最初の配列は、例がどのように配置されているかを示す例です。2 番目と 3 番目は、実際の値です。したがって、私が望むのは、最初のインデックスでより高い値を含む配列を持つこれらの配列を並べ替えて、ランキングの上位に移動することです。この例では、テリー配列である 7.5 を持つ配列は、 4.5 を持つ配列の前に移動する必要があります。結果を降順で NSMutableArray に保持したい。ありがとうございました。

4

3 に答える 3

2

これはそれを行う必要があります:

[ultimateHighscoreArray sortUsingComparator:^(id obj1, id obj2) {
    NSNumber *score1 = [obj1 objectAtIndex:1];
    NSNumber *score2 = [obj2 objectAtIndex:2];

    // Reverse the comparison here (compare score2 to score1)
    // in order to get a descending order
    return [score2 compare:score1];
}];

一般的なアドバイス:データ構造がNSDictionaryインスタンスの配列またはカスタムオブジェクトの配列(カスタムScoreクラスなど)である場合は、データ構造がより明確になります。そのような場合はNSSortDescriptor、配列を並べ替えるために使用することもできます。これにより、コードがよりクリーンで読みやすくなります。

于 2012-06-20T14:05:57.533 に答える
2

このsortUsingComparator:メソッドを使用すると、ブロックを使用して配列を並べ替えることができます。例:

[ultimateHighscoreArray sortUsingComparator:^(id obj1, id obj2) {
    return [[obj1 objectAtIndex:1] compare:[obj2 objectAtIndex:1]];
}];

わかりやすくするために、このデータ構造には辞書の配列(またはカスタムクラスのインスタンス)を使用する方がよいでしょう。

于 2012-06-20T14:06:05.420 に答える
0

このようなカスタムコンパレータを書くことができます:)

[ultimateHighscoreArray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSArray *arrayA = (NSArray *)obj1;
    NSArray *arrayB = (NSArray *)obj2;

    double scoreA = [arrayA objectAtIndex:1];
    double scoreB = [arrayB objectAtIndex:1];

    if (scoreA > scoreB) {
        return NSOrderedDescending;
    } else if (scoreA < scoreB) {
        return NSOrderedAscending;
    } else {
        return NSOrderedSame;
    }
}];
于 2012-06-20T14:05:53.743 に答える