【问题标题】:How to sort HashMap by referring another HashMap如何通过引用另一个 HashMap 对 HashMap 进行排序
【发布时间】:2020-12-01 19:58:59
【问题描述】:

我在 Java 中有两个 HashMap

第一个包含一个键和它的值。其中 second 包含该键的评估索引(顺序)。我想通过参考第二张地图对第一张地图进行排序。

第一个 HashMap <key, value>

<"C","ccc">
<"D","ddd">
<"A","aaa">
<"B","bbb">

第二个HashMap&lt;key, value&gt;

<"0","A">
<"1","B">
<"2","C">
<"3","D">

结果应该是

<"A","aaa">
<"B","bbb">
<"C","ccc">
<"D","ddd">

循环这两个映射并检查比较键很简单但效率不高。有什么有效的想法吗?

【问题讨论】:

    标签: java collections hashmap linkedhashmap


    【解决方案1】:

    您可以使用 Java Stream API。首先,通过键对第二个映射条目集进行排序,然后将第二个映射的值映射为键,并通过第二个映射的值获取第一个映射的值,然后使用Collectors.toMap 收集为LinkedHashMap

    secondMap.entrySet().stream()
             .sorted(Comparator.comparing(Map.Entry::getKey))
             .collect(Collectors.toMap(Map.Entry::getValue, k -> firstMap.get(k.getValue()),
                                                              (x, y) -> y, LinkedHashMap::new));
    

    如果您对第二张地图使用按键排序的 LinkedHashMap/TreeMap,则无需对键进行排序。见演示here

    【讨论】:

    • 如果第一张地图是 Map。您的代码不起作用
    • @kandarp 它正在工作,请参阅此处demo
    • new AbstractMap.SimpleEntry&lt;&gt; 可以是Map.entry
    • @kandarp 如果第二个HashMap是{"0000000"="A", "1111111"="B", "2222222"="C", "3333333"="D"},则结果是{"C"="ccc", "D"="ddd", "B"="bbb", "A"="aaa"}。可以吗?
    • @saka1029 你是想说这个案子吗? onlinegdb.com/S1tb4zbGw 它对我有用。
    【解决方案2】:

    首先HashMap 不是有序集合。 HashMap 中的键值对是根据键的 hashCode() 结果的值排序的。所以我想说你不能在HashMap 中保留排序值。

    相反,您可以使用LinkedHashMap - 它将按照插入顺序进行排序。

    对于您的解决方案,我会这样做:

    HashMap<String, String> firstMap = ...
    HashMap<String, String> secondMap = ...
    LinkedHashMap<String, String> orderedMap = new LinkedHashMap<>();
    for (int i = 0; i < secondMap.size(); ++i) {
       String key = secondMap.get(String.valueOf(i));
       orderedMap.put(key, firstMap.get(key));
    }
    
    

    没有运行此代码,但它应该可以工作。

    或者,您可以使用基于键的Comparable 接口排序的TreeMap

    并回答哪个更好用 - TreeMap 或 LinkedHashMap - 取决于您以后实际使用此地图的方式。在大多数情况下,LinkedHashMap 就足够了,尽管如果您需要,例如,获取最接近某个键的更大元素,那么 TreeMap 是一种选择。

    HashMap和TreeMap有一些比较 What is the difference between a HashMap and a TreeMap?

    【讨论】:

      【解决方案3】:

      遍历secondMap的values,收集map中设置的相关key、value:

      Map<String, String> result = secondMap.values().stream()
              .collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
      

      试试这个:

      Map<String, String> firstMap = new HashMap<>();
      firstMap.put("C", "ccc");
      firstMap.put("D", "ddd");
      firstMap.put("A", "aaa");
      firstMap.put("B", "bbb");
      
      Map<String, String> secondMap = new HashMap<>();
      secondMap.put("0", "A");
      secondMap.put("1", "B");
      secondMap.put("2", "C");
      secondMap.put("3", "D");
      
      Map<String, String> result = secondMap.values().stream()
              .collect(Collectors.toMap(Function.identity(), firstMap::get, (x,y)-> x, LinkedHashMap::new));
      System.out.println(result);
      

      【讨论】:

        猜你喜欢
        • 2017-11-12
        • 1970-01-01
        • 2014-11-12
        • 2011-09-20
        • 2012-07-27
        • 2020-04-09
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多