按值对 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 的选项变得越来越可取。我个人更喜欢它,因为它更具可读性。