【问题标题】:Sorting a HashMap or TreeMap by value [duplicate]按值对HashMap或TreeMap进行排序[重复]
【发布时间】:2018-06-06 01:04:26
【问题描述】:

我正在制作一个记录足球比赛并显示联赛表的 java 项目。当一场比赛被添加到两支球队之间的联赛中时,我需要一种基于球队拥有的积分数来存储球队在联赛中的位置的方法。

要做到这一点,我正在考虑使用 HashMap,其中 Integer 根据球队拥有的积分数存储球队在联盟中的位置。每当添加新游戏时,我都需要对这个列表进行排序,以便在得分最多的球队更接近第一名的位置进行排序。

例如,如果有三个团队

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

我希望这样订购地图

1 : A, 2:乙, 3:C

我的问题是:

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

2) 我将如何实现代码以按获得的积分对联赛进行排序?

【问题讨论】:

  • 如果两个团队在同一个地方,这不会中断吗?
  • 是的,但我也想排除两支球队的净胜球。比如说A队有3分,B队有3分。如果A队净胜球3分,B队净胜球5分,那么B队在联赛中的排名应该更高。
  • 另外,如果目标差相同,那么应该由谁的目标最多。如果那是相同的,我不确定它们的顺序是否重要。
  • 地图不是您用例的正确数据结构。请改用列表。

标签: java sorting hashmap treemap


【解决方案1】:

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 类具有可比性,您可以使用比较器(继续上面的 sn-p):

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

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

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

【讨论】:

  • 谢谢,你知道如何扩展这个答案吗?如果两支球队的得分相同,我还需要按球队 - 目标差中的第二个变量排序。
  • 添加了目标差异
  • 太棒了,非常感谢。
【解决方案2】:

对于第一名,我建议使用地图而不是将排名存储在团队对象中,这样可以更容易地验证没有两个排名重复的团队。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 2011-12-28
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多