【问题标题】:Best way to order an HashMap by key in Java?在 Java 中按键排序 HashMap 的最佳方法?
【发布时间】:2015-11-17 14:51:11
【问题描述】:

这是我第一次用 Java 订购 HashMap。我需要按键来做到这一点,但在我的情况下,按键是一个对象,所以我需要按特定字段排序。试图自己弄清楚,我考虑继续这个简单的代码:

private HashMap<SimpleDBField, String> sortTable(HashMap<SimpleDBField, String> row){

    LinkedHashMap<SimpleDBField, String> orderedRow = new LinkedHashMap<SimpleDBField, String>();

    for(int i = 1; i <= row.size(); i ++){
        Iterator iterator = row.entrySet().iterator();

        while(iterator.hasNext()){
            Map.Entry<SimpleDBField, String> entry = (Map.Entry<SimpleDBField, String>) iterator.next();

            if(entry.getKey().getListPosition()==i){
                orderedRow.put(entry.getKey(), entry.getValue());
                break;
            }
        }
    }

    return orderedRow;
}

假设它可以工作并且我不关心性能,在真正使用它之前,我想知道下一段代码是否会更好,最重要的是:为什么?

以下来源示例:How to sort HashMap by key and value in Java

public static <K extends Comparable,V extends Comparable> Map<K,V> sortByKeys(Map<K,V> map){

    List<K> keys = new LinkedList<K>(map.keySet());

    Collections.sort(keys);

    Map<K,V> sortedMap = new LinkedHashMap<K,V>();

    for(K key: keys){
        sortedMap.put(key, map.get(key));

    }

    return sortedMap;
}

如果两者都错了,我该怎么做?

【问题讨论】:

  • 你不能那样做;根据定义,HashMap 的键没有定义的顺序。另外,您想要插入顺序还是某种自然顺序(即通过 Comparable)?
  • 哈希集合总是无序的,以达到按键访问的最大可能性能。

标签: java sorting hashmap comparable linkedhashmap


【解决方案1】:

是的,我们可以使用 TreeMap。

TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);

【讨论】:

    【解决方案2】:

    在java8中,可以使用如下代码:

        public static <K extends Comparable, V> Map<K,V> sortMapByKey(Map<K, V> unsortedMap) {
        Map<K, V> sortedMap = new LinkedHashMap<>();
    
        unsortedMap.entrySet().stream()
                .sorted(Map.Entry.<K, V>comparingByKey())
                .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));
        return sortedMap;
    }
    

    【讨论】:

      【解决方案3】:

      正如您所见,您无法控制HashMap 的排序。 LinkedHashMap 只是具有可预测迭代顺序的 HashMap - 这是朝着正确方向迈出的一步,但它仍然使事情过于复杂。 Java 有一个用于排序地图的内置接口(毫不奇怪的名称SortedMap)和几个实现,最流行的一个是TreeMap。只需使用它,让 Java 完成所有繁重的工作:

      public static <K extends Comparable, V> Map<K,V> sortByKeys(Map<K,V> map) {
          return new TreeMap<>(map);
      }
      

      【讨论】:

        【解决方案4】:

        最好的方法是使用TreeMap

        TreeMap&lt;Foo, Bar&gt; foo = new TreeMap(myHashMap);

        如果您需要自定义比较器,可以使用new TreeMap(Comparator c),然后将HashMap 的内容与foo.putAll(myMap); 一起添加。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-22
          • 1970-01-01
          • 2011-08-16
          • 2023-03-17
          • 2017-01-29
          • 2014-05-30
          • 1970-01-01
          • 2010-09-17
          相关资源
          最近更新 更多