按值排序HashMap或TreeMap [duplicate]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按值排序HashMap或TreeMap [duplicate]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我正在制作一个记录足球比赛并显示联赛表的java项目。当一个游戏被添加到两个团队之间的联盟时,我需要一种方法来根据团队所拥有的点数来存储团队在联盟中的位置。

要做到这一点,我正在考虑使用HashMap <Integer,Team>,其中Integer根据团队拥有的点数存储团队中的团队位置。每当添加新游戏时,我都需要一种对这个列表进行排序的方法,以便将具有最大点数的团队更接近第一位置进行排序。

例如,如果有三个团队

A队得到8分,B队得到5分,C队得到4分

我希望地图可以这样订购

1:A,2:B,3:C

我的问题是:

1)你认为我应该为这个实例使用HashMap或TreeMap吗?

2)我如何通过获得的积分来实施代码来对联盟进行排序?

答案

List更适合您的用例。它为您提供开箱即用的索引和无忧排序。此外,它更适合于有序显示值,例如表格等。

我会使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类,您可以使用列表功能:

List<Team> teams = ...
Collections.sort(teams);

如果你不想使Team类可比,你可以使用比较器(继续上面的代码片段):

teams.sort((team1, team2) -> 
   (team2.getPoints() != team1.getPoints()) ? 
     (team2.getPoints() - team1.getPoints()) : 
     (team2.getGoalDifference() - team1.getGoalDifference())
   );

注意,在可比较或比较器中实现了降序逻辑。您可以选择使用反向比较器。

随着比较字段数量的增加,实现Comparator的选项变得越来越优选。我个人更喜欢它,因为它更具可读性。

另一答案

对于第一,我建议使用地图而不是在团队对象中存储等级,这将使得更轻松地验证没有两个团队具有重复排名。

对于第二个,您可以编写一个实现Comparator接口的类。您将必须实现compare方法,您将比较两个对象(在本例中为Teams),如果第一个对象小于,等于或大于第二个对象,则返回负数,零或正数。为此,您必须将地图的实现从HashMap更改为TreeMap

以上是关于按值排序HashMap或TreeMap [duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

如何决定使用 HashMap 还是 TreeMap?

如何决定使用 HashMap 还是 TreeMap?

按值对HashMap进行排序[重复]

Java Map按键(Key)排序和按值(Value)排序

TreeMap 与 HashMap 区别相关套路题

HashMap与TreeMap按照key和value排序