在 Java 中按键订购 HashMap 的最佳方式?
Best way to order an HashMap by key in Java?
这是我第一次在 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;
}
如果两者都错了,我该怎么办?
最好的方法是使用 TreeMap
.
TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
如果您需要自定义比较器,可以使用 new TreeMap(Comparator c)
,然后将 HashMap
的内容添加到 foo.putAll(myMap);
。
你无法控制HashMap
's ordering, as you've seen. A LinkedHashMap
is just a HashMap
with a predictable iteration order - it's a step in the right direction, but it's still over-complicating things. Java has a built-in interface for sorted maps (with the unsurprising name SortedMap
), and a couple of implementation, the most popular one being a TreeMap
。只需使用它,让 Java 完成所有繁重的工作:
public static <K extends Comparable, V> Map<K,V> sortByKeys(Map<K,V> map) {
return new TreeMap<>(map);
}
是的,我们可以使用 TreeMap。
TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
在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;
}
这是我第一次在 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;
}
如果两者都错了,我该怎么办?
最好的方法是使用 TreeMap
.
TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
如果您需要自定义比较器,可以使用 new TreeMap(Comparator c)
,然后将 HashMap
的内容添加到 foo.putAll(myMap);
。
你无法控制HashMap
's ordering, as you've seen. A LinkedHashMap
is just a HashMap
with a predictable iteration order - it's a step in the right direction, but it's still over-complicating things. Java has a built-in interface for sorted maps (with the unsurprising name SortedMap
), and a couple of implementation, the most popular one being a TreeMap
。只需使用它,让 Java 完成所有繁重的工作:
public static <K extends Comparable, V> Map<K,V> sortByKeys(Map<K,V> map) {
return new TreeMap<>(map);
}
是的,我们可以使用 TreeMap。
TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
在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;
}