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

And*_*ndi 1 java sorting hashmap comparable linkedhashmap

这是我第一次HashMap在Java中订购.我需要通过密钥来做到这一点,但在我的情况下,密钥是一个对象,所以我需要按特定字段排序.试图通过我自己来计算它我已经考虑继续这个简单的代码划痕:

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;
}
Run Code Online (Sandbox Code Playgroud)

假设它有效并且我不关心性能,在真正使用它之前,我想知道下一个代码划痕是否更好,最重要:为什么?

下面的示例源代码:如何按Java中的键和值对HashMap进行排序

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Kay*_*man 6

最好的方法是使用一个TreeMap.

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

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


Mur*_*nik 5

HashMap正如您所见,您无法控制订购.A LinkedHashMap只是HashMap具有可预测的迭代顺序 - 它是朝着正确方向迈出的一步,但它仍然过于复杂化.Java有一个用于排序映射的内置接口(具有不令人惊讶的名称SortedMap),以及一些实现,最受欢迎的是a TreeMap.只需使用它,让Java做所有繁重的工作:

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