使用关系对 NSMutableArray 进行排序

Posted

技术标签:

【中文标题】使用关系对 NSMutableArray 进行排序【英文标题】:Sort NSMutableArray with Ties 【发布时间】:2013-05-23 23:55:03 【问题描述】:

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

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

第 1 - (100 分) 第 2 - (90 分) 第三 - (50 分) 第 4 - (10 分)

但问题是,当我的得分出现平局时,我需要它像这样出现:

第 1 - (100 分) 第一名 - (100 分) 第三 - (60 分) 第三 - (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】:

通常情况下,当你打成平手时,你实际上会跳过较低的排名——也就是说,如果你和第二名,你的球员将是第一名、第二名、第二名和第四名,没有人获得第三名。我会通过这样做来实现这一点:

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++;

【讨论】:

谢谢它的工作!我只是将 rankWithTies++ 更改为 rankWithTies = rank。

以上是关于使用关系对 NSMutableArray 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按升序对 NSMutablearray 进行排序

如何对日期对象的 NSMutableArray 进行排序

我如何对 NSMutableArray iphone 进行排序?

根据优先级对 NSMutableArray 进行排序

如何按数值对包含 NSDictionary 的 NSMutableArray 进行排序?

如何对包含 NSIndexPath 整数数组的 NSMutableArray 进行排序?