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)
如果两者都错了,我该怎么做?
最好的方法是使用一个TreeMap
.
TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
如果你需要一个自定义的比较,您可以使用new TreeMap(Comparator c)
,然后添加的内容HashMap
与出现foo.putAll(myMap);
.
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)