在Java中按键排序HashMap的最佳方法?

时间:2015-08-24 08:42:47

标签: java sorting hashmap comparable linkedhashmap

这是我第一次在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;
}

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

4 个答案:

答案 0 :(得分:6)

最好的方法是使用TreeMap

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

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

答案 1 :(得分:5)

正如您所见,您无法控制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);
}

答案 2 :(得分:0)

是的,

我们可以使用TreeMap。

TreeMap foo = new TreeMap(myHashMap);

答案 3 :(得分:0)

在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;
}