【问题标题】:Sorting a hashmap first with values then keys in java首先用值对哈希图进行排序,然后在java中使用键
【发布时间】:2021-07-05 19:59:19
【问题描述】:

大家好,我有一个像 a:1,c:2,d:3,b:2 这样的哈希映射,我想像 d:3,b:2 这样对它进行排序,c:2,a:1, 值递减和键中的字母顺序我该怎么做我会很感激任何帮助谢谢!

【问题讨论】:

  • 你能证明自己任何努力解决这个问题吗?
  • 嘿但丁,欢迎!你已经尝试过什么了吗?最好从现有的东西开始,以进一步帮助您
  • 我重新打开了,因为假定的重复是关于地图的简单排序。这个问题比较复杂,要求先按值排序,再按键。

标签: java sorting hashmap


【解决方案1】:

按值和键的降序对以下内容进行排序。我修改了列表以使其更有趣。

Map<String, Integer> map = Map.of("a", 8, "b", 2, "c", 4, "d",
                8, "e", 3, "f", 4, "g", 7, "h", 1, "i", 5, "j", 2);

首先定义一个Comparator 用于对Map 条目进行排序。每个条目都由Map.Entry 类表示。该类提供方法comparingByValue()comparingByKey()

下面的代码说,首先按value 排序,然后按key。这些按自然顺序排序,但以下reversed() 方法表示反转所有比较器的排序。因此values 将按相反顺序排序,keys 按字母顺序排序。

Comparator<Entry<String, Integer>> comp = Entry
        .<String, Integer>comparingByValue().reversed()
        .thenComparing(Entry.comparingByKey());

这会流式传输现有地图的条目并将比较器应用于排序方法。然后它将它们收集在链接的 hashMap 中以保留顺序。合并函数在其中没有作用,但在语法上是必需的。

Map<String, Integer> lhmap =
        map.entrySet().stream().sorted(comp)
                .collect(Collectors.toMap(Entry::getKey,
                        Entry::getValue,
                        (a, b) -> a,      // merge function
                        LinkedHashMap::new));

lhmap.entrySet().forEach(System.out::println);

该代码打印:

a=8
d=8
g=7
i=5
c=4
f=4
e=3
b=2
j=2
h=1

【讨论】:

  • 我认为您误读了这个问题,就像我所做的那样。该问题主要要求按 values 排序,其次按 keys 排序。这些值可能巧合地相等(多个),因此其次按键排序确实有意义。
  • 你是对的。是时候调整了。谢谢!!
  • 感谢 WJS 和 Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; firstwithvaluessecoundwiththekeys = Map.Entry .&lt;String, Integer&gt;comparingByValue().reversed() .thenComparing(Map.Entry.comparingByKey()); 这样的比较器,我已经解决了我的问题,再次感谢大家!
【解决方案2】:

此答案使用 java 8 流。

//LinkedHashMap保留插入元素的顺序

LinkedHashMap<String, Integer> reverseSortedMap = new LinkedHashMap<>();
    unSortedMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            .forEachOrdered(x -> reverseSortedMap.put(x.getKey(), x.getValue()));
     
    System.out.println("Reverse Sorted Map   : " + reverseSortedMap); 

【讨论】:

    【解决方案3】:

    HashMap 不一定是有序的,实际上并不能保证键值对的顺序会随着时间的推移保持不变。来自文档:

    Map 接口的基于哈希表的实现。此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap 类大致相当于 Hashtable,除了它是不同步的并且允许空值。)这个类不保证映射的顺序;特别是,它不保证订单会随着时间的推移保持不变。

    如果您想要排序地图,请使用NavigableMapSortedMap。有几个选项。 TreeMap 可能是最简单的。

    基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序或在地图创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。

    因此,要使用按字母降序排列的键创建地图,应该这样做:

    Comparator<String> comparator = new Comparator<>() {
        @Override
        public int compare(String o1, String o2) {      
            return o2.compareTo(o1);
        }
    };
    
    TreeMap<String, Integer> treeMap = new TreeMap<>(comparator);
    

    【讨论】:

    • 这如何解决这个问题?该问题首先询问按值排序,然后按键排序。
    • OP 询问如何对HashMap 进行排序,所以我给了他们一个创建排序映射的简单示例。我阅读了“值降序和键中的字母顺序”部分作为映射的描述,部分原因是对键进行排序,然后值没有多大意义,因为 HashMap 中的键是唯一的并且排序匹配键价值不是问题。这可能是我的误解。感谢您对我的回答的补充,它们绝对有帮助!
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多