Objective-C按内部数组的值对数组进行排序

时间:2012-06-20 13:55:08

标签: objective-c sorting multidimensional-array indexing

我想对一个NSMutableArray进行排序,该NSMutableArray具有与NSArray的索引1处的值相关的NSArrays。我将尝试绘制阵列图片。

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

NSMutableArray中的第一个数组是一个显示示例如何定位的示例。第二和第三是价值实际上是如何。所以,我想要的是对这些数组进行排序,使得在第一个索引处包含更高值的数组在排名中更高。对于此示例,具有7.5的特里阵列的数组应该在具有4.5的数组之前。我希望结果按递减顺序保存在NSMutableArray中。谢谢。

3 个答案:

答案 0 :(得分: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对数组进行排序,这样可以生成更清晰,更易于阅读的代码。

答案 1 :(得分:2)

sortUsingComparator:方法允许您使用块对数组进行排序,例如:

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

为清楚起见,为这个数据结构使用字典数组(或自定义类的实例)可能会更好。

答案 2 :(得分: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;
    }
}];