(Java)如何对对象数组进行排序,并在两个对象之间打破平局?

7
假设我有一个对象 - TeamTeam 有三个字段,winslossesdraws
如果我有几个对象,比如Team1Team2Team3,其中Team1有3胜2负1平,Team2有3胜3负,Team3有2胜3负1平。
将这三个团队放入一个数组中。
我想按获胜次数对它们进行排序(我知道如何实现此操作...实现Comparable,覆盖compareTo()使用Array.sort),如果两个团队获胜次数相同,则按输的次数排序(最终还会添加第三个字段以进一步打破平局)。
我应该编写自己的排序方法吗?有人能指点我应该怎么做吗?

如果你编写了一个合适的 compareTo(或者一个 Comparator),你就不需要编写自己的排序算法。 - ajb
感谢大家的快速和有用的回复,我已经通过使用比较器和修改我的现有compareTo方法使其正常工作! - Mike Aubol
4个回答

5
与Ben的答案类似,但有些不同的是,为了更加清晰,我经常使用以下模式。 这是一个比较器(Comparator),但可比较(Comparable)的代码也会很相似。
Comparator<Team> myComparator = new Comparator() {
   @Override
   public int compare(Team t1, Team t2) {
      int result = t1.getWins() - t2.getWins();
      if (result == 0)
         result = t2.getLosses() - t1.getLosses();
      if (result == 0)
         ... more tests here

      return result;
   }

};

请注意,在极端情况下,对两个整数进行差运算可能会导致溢出,因此更健壮的变体将使用Integer.compare(t1.getWins(), t2.getWins())。 但是,在这种情况下,您的团队很少会有超过2 ^ 31胜利或失败。 :-)
要使用它,请转到
Arrays.sort(myArrayOfTeams, myComparator);

5
如果您很幸运地使用,您可以这样做:
ArrayList<Team> teams = myTeams();

Collections.sort(teams,
    Comparator.comparingInt(Team::getWins())
              .thenComparingInt(Team::getTies());
    );

或者如果您正在使用数组:

Team[] teams = myTeams();

Arrays.sort(teams,
    Comparator.comparingInt(Team::getWins())
              .thenComparingInt(Team::getTies());
    );

这也使得按其他因素排序更加容易,例如团队名称。

0
在您重写的compareTo()方法中,您只需要捕获当胜利次数相等时,并根据输赢情况分配偏好即可。
compareTo(Team other){
    if(this.getWins() > other.getWins()){
        return 1;
    } else if(this.getWins() == other.getWins()){
        if(this.getLosses() < other.getLosses()){
            return 1;
        }
        return -1;
    }
    return -1;
}

然后你可以在内部循环中添加另一个else if来检查损失是否相等,在那个if语句中,你将比较平局,如果它们完全相等,你将返回0


0
你需要修改Comparable,不仅要考虑胜利,还要考虑平局,特别是在胜利发生时。
因此,在你的compareTo中,添加一个if来检查胜利是否相等,然后在该if内部进行损失检查。在这里,您甚至可以添加对平局的检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接