使用Ties对NSMutableArray进行排序

时间:2013-05-23 23:55:03

标签: ios arrays macos sorting

我有一个NSMutableArray,包含4个对象。这些对象中的每一个都具有int类型的属性,称为 score 此数组按此属性降序排序。那很好。

现在我正在制作一个记分牌,它接收这个数组并通过它进行枚举。基本上我需要它来查看 array.score 属性并为其分配排名。

第1名 - (100分) 第二 - (90分) 第3名 - (50分) 第4 - (10分)

但问题是,当我有分数关系时,我需要它像:

第1名 - (100分) 第1名 - (100分) 第3 - (60分) 第3 - (60分)

基本上,我需要将领带分数显示为关系。看起来真的很简单......但是我的大脑现在正在努力解决这个问题。

这就是我所拥有的(这不起作用):

    // If we have the same score, the rank does not change
int rank = 1;
int rankWithTies = 1;
int previousScore = 0;


NSLog(@"------- PLAYER SCORES ------");
for (PlayerStat *stat in rotatorSorted) {

    if (stat.score < previousScore) {

        NSLog(@"A %i. Player %i - score:%i", rank, stat.playerNumber, stat.score);
        rankWithTies++;


    } else {
        previousScore = stat.score;
        NSLog(@"B %i. Player %i - score:%i", rankWithTies, stat.playerNumber, stat.score);
    }

    rank++;
}

1 个答案:

答案 0 :(得分:2)

通常情况下,当你有平局时,你实际上跳过了较低的等级 - 也就是说,如果你有一个并列第二,你的球员将分别是第1,第2,第2和第4,没有人获得第3名。我会通过做这样的事情来实现这一点:

NSUInteger rankIgnoringTies = 1;
NSUInteger rankWithTies = 1;
NSUInteger previousScore = NSUIntegerMax;

NSLog(@"------- PLAYER SCORES ------");
for (PlayerStat *stat in rotatorSorted) {
    if(stat.score < previousScore) {
        // This is not a tie, so we should move rankWithTies to the next rank.
        rankWithTies = rankIgnoringTies;
    }

    NSLog(@"%i. Player %i - score:%i", rankWithTies, stat.playerNumber, stat.score);

    previousScore = stat.score;
    rankIgnoringTies++;
}