当前位置: 首页 > 知识库问答 >
问题:

同时按值降序和按键升序对HashMap进行排序

黎承颜
2023-03-14

考虑下面的哈希图:

HashMap<String, Double> cityScoreMap = new HashMap<>();

具有诸如

CityB, 5.0
CityC, 10.0
CityA, 5.0

我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序:


CityC, 10.0 (highest value)
CityA, 5.0 (comes before CityB, because A < B)
CityB, 5.0 (comes after CityA)

到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?

共有1个答案

柳胡媚
2023-03-14

实现这种映射的最简单方法是使用流。您必须实现一个比较器。

Map<String, Double> cityScoreMap = new HashMap<>();
cityScoreMap.put("CityB", 5.0);
cityScoreMap.put("CityC", 10.0);
cityScoreMap.put("CityA", 5.0);

Comparator<Map.Entry<String, Double>> descendingValueAscendingKeyComparator = (entry1, entry2) -> {
        //natural ordering of numbers is ascending, so comparing entry2 value to entry1 value makes for descending order
        int cmp = entry2.getValue().compareTo(entry1.getValue());
        if (cmp == 0) {
            //if comparison result is zero, that means values are equal, so we are comparing keys
            //we are comparing entry1 to entry2 keys for ascending order, which is natural for string
            return entry1.getKey().compareTo(entry2.getKey());
        }
        return cmp;
    };
cityScoreMap.entrySet()//get the set of entries in the map
            .stream()//stream the entries
            .sorted(descendingValueAscendingKeyComparator)//sort the entries with the supplied comparator
            .forEach(entry -> System.out.println(entry.getKey() + ", " + entry.getValue()));//print to verify ordering

比较器定义元素的顺序,这可能不同于它们的自然顺序。此比较器定义映射中条目(键值对)的顺序-首先按值降序,然后按键升序。在这里,条目只是打印出来的,因此您可以查看顺序,但是您也可以将它们存储在另一个结构中,这样可以保持它们的顺序—例如LinkedHashMap,不管您实际需要什么。

您应该从javadoc开始阅读比较器和可比较接口。

 类似资料:
  • 我有一个HashMap与作为关键和一个值作为价值。 我的目标是通过降序值对Hashmap进行排序。应在

  • 问题内容: 你好,我需要实现一个接收HashMap并按键对它的值进行排序(mergeSort)的方法 (不使用TreeMap,SortedMap或Collections.Sort或使用JAVA Packages中的任何排序解决方案) 。我的问题是处理通配符类型…这是我的实现(由于使用通配符而返回编译错误) 我感谢您的帮助! 问题答案: 像其他评论者一样,我建议您阅读Java中的泛型主题。您在合并中

  • 我有数据。表中有大约300万行和40列。我希望在组内按降序对该表排序,如以下sql模拟代码: 数据中是否存在等效的方法。这张桌子可以吗?到目前为止,我必须将其分解为两个步骤: 这非常快,只需要几秒钟。 这一步需要更长的时间(5分钟)。 更新:有人评论要执行<code>X 我的方法是:setkey()然后是order(-Month) 我现在的问题是:如果我想按年、MemberId和一个又一个排序(年

  • 我有一个通用的链表,目前由int组成,我想在默认情况下按升序排序,然后切换一个布尔值,按降序排序。我该怎么做?

  • 有人能提供帮助,如何检查排序降序数组以及?干杯!

  • 问题内容: 我需要根据存储在其中的值对我进行排序。在包含存储在手机联系人的名字。 另外,我还要求在对值进行排序时对键进行自动排序,否则你可以说键和值绑定在一起,因此值的任何更改都应反映在键中。 要求的输出: 问题答案: 尝试下面的代码对我来说很好。你可以选择升序和降序 编辑:版本2 使用了新的Java功能,例如流for-each等 如果值相同,则地图将按键排序