说我有一个对象 - Team
。 Team
有三个字段wins
,losses
和draws
。
如果我有几个对象说Team1
,Team2
,Team3
,其中Team1
有3胜2负1关系,Team2
有3胜3负,Team3
有2胜3负1平。
将所有三支球队分组。
我正在尝试排序(我知道如何做到这一点..实现Comparable
,覆盖compareTo()
使用Array.sort
)胜利,如果两个团队拥有相同的胜利,我想通过损失对它们进行排序(最终会增加第三个字段以进一步打破关系)。
我应该编写自己的排序方法吗?有人能指出我正确的方向,因为我不知道该去哪里。
答案 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)
如果您有幸使用java-8,那么您可以这样做:
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