(Java)如何对对象数组进行排序,并断开两个对象之间的联系?

时间:2014-11-19 23:51:50

标签: java arrays sorting object

说我有一个对象 - TeamTeam有三个字段winslossesdraws

如果我有几个对象说Team1Team2Team3,其中Team1有3胜2负1关系,Team2有3胜3负,Team3有2胜3负1平。

将所有三支球队分组。

我正在尝试排序(我知道如何做到这一点..实现Comparable,覆盖compareTo()使用Array.sort)胜利,如果两个团队拥有相同的胜利,我想通过损失对它们进行排序(最终会增加第三个字段以进一步打破关系)。

我应该编写自己的排序方法吗?有人能指出我正确的方向,因为我不知道该去哪里。

4 个答案:

答案 0 :(得分:3)

与Ben的答案类似,但有点不同,为了清晰起见,我经常使用以下模式。这是比较器,但可比较的代码类似。

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

答案 1 :(得分:2)

如果您有幸使用,那么您可以这样做:

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());
    );

这也可以更容易地按其他方式进行排序,例如团队名称。

答案 2 :(得分:0)

你需要修改Comparable,不仅要考虑胜利,还要考虑关系,特别是在获胜时。

所以在你的compareTo中,添加一个if来检查胜利何时相等,然后在里面检查是否检查损失。在这里你甚至可以添加抽签检查。

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

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