这是我第一次在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;
}
如果两者都错了,我该怎么做?
答案 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;
}