按值对 HashMap 或 TreeMap 进行排序
Sorting a HashMap or TreeMap by value
我正在制作一个 java 项目,记录足球比赛并显示联赛 table。当两支球队之间的联赛被添加到联赛中时,我需要一种方法来根据球队的积分数来存储球队在联赛中的位置。
要做到这一点,我正在考虑使用 HashMap,其中 Integer 根据球队拥有的积分来存储球队在联赛中的位置。每当添加新游戏时,我都需要一种对该列表进行排序的方法,以便将其排序为得分最高的球队更接近第一名。
例如,如果有三支球队
A队8分,
B队得5分,
C队4分
我希望这样订购地图
1:一个,
2:乙,
3 : C
我的问题是:
1) 你认为我应该为这个实例使用 HashMap 还是 TreeMap?
2) 我将如何实现按获得的积分对联赛进行排序的代码?
对于第一个,我建议使用映射而不是将排名存储在团队对象中,这样可以更容易地验证没有两个团队具有重复的排名。
对于第二个,您可以编写一个 class 实现 Comparator
接口。您将必须实施 compare
方法,在该方法中您将比较两个对象(在本例中为 Teams),如果第一个对象小于、等于或等于 return 负数、零或正数大于第二个对象。为此,您必须将地图的实现从 HashMap
更改为 TreeMap
。
A List
更适合您的用例。它为您提供开箱即用的索引和无忧排序。此外,它更适合有序显示值,例如 table 等
我会让 Team
对象具有可比性,使用数组列表,然后我就完成了:
public class Team implements Comparable<Team> {
private int points;
private int goalDifference;
public Team(int points, int goalDifference) {
this.points = points;
this.goalDifference = goalDifference;
}
@Override
public int compareTo(Team other) {
int res = other.points - this.points;
return res != 0 ? res : (other.goalDifference - this.goalDifference);
}
//getters and setters
}
具有可比性Team
class,您可以使用列表功能:
List<Team> teams = ...
Collections.sort(teams);
如果您不想让 Team
class 具有可比性,您可以使用比较器(继续上面的代码片段):
teams.sort((team1, team2) ->
(team2.getPoints() != team1.getPoints()) ?
(team2.getPoints() - team1.getPoints()) :
(team2.getGoalDifference() - team1.getGoalDifference())
);
请注意,在比较器或比较器中实现了降序逻辑。您可以选择使用反向比较器。
随着比较字段数量的增加,实现 Comparator 的选项变得越来越可取。我个人更喜欢它,因为它更具可读性。
我正在制作一个 java 项目,记录足球比赛并显示联赛 table。当两支球队之间的联赛被添加到联赛中时,我需要一种方法来根据球队的积分数来存储球队在联赛中的位置。
要做到这一点,我正在考虑使用 HashMap
例如,如果有三支球队
A队8分, B队得5分, C队4分
我希望这样订购地图
1:一个, 2:乙, 3 : C
我的问题是:
1) 你认为我应该为这个实例使用 HashMap 还是 TreeMap?
2) 我将如何实现按获得的积分对联赛进行排序的代码?
对于第一个,我建议使用映射而不是将排名存储在团队对象中,这样可以更容易地验证没有两个团队具有重复的排名。
对于第二个,您可以编写一个 class 实现 Comparator
接口。您将必须实施 compare
方法,在该方法中您将比较两个对象(在本例中为 Teams),如果第一个对象小于、等于或等于 return 负数、零或正数大于第二个对象。为此,您必须将地图的实现从 HashMap
更改为 TreeMap
。
A List
更适合您的用例。它为您提供开箱即用的索引和无忧排序。此外,它更适合有序显示值,例如 table 等
我会让 Team
对象具有可比性,使用数组列表,然后我就完成了:
public class Team implements Comparable<Team> {
private int points;
private int goalDifference;
public Team(int points, int goalDifference) {
this.points = points;
this.goalDifference = goalDifference;
}
@Override
public int compareTo(Team other) {
int res = other.points - this.points;
return res != 0 ? res : (other.goalDifference - this.goalDifference);
}
//getters and setters
}
具有可比性Team
class,您可以使用列表功能:
List<Team> teams = ...
Collections.sort(teams);
如果您不想让 Team
class 具有可比性,您可以使用比较器(继续上面的代码片段):
teams.sort((team1, team2) ->
(team2.getPoints() != team1.getPoints()) ?
(team2.getPoints() - team1.getPoints()) :
(team2.getGoalDifference() - team1.getGoalDifference())
);
请注意,在比较器或比较器中实现了降序逻辑。您可以选择使用反向比较器。
随着比较字段数量的增加,实现 Comparator 的选项变得越来越可取。我个人更喜欢它,因为它更具可读性。