This is the first time that I have to order an HashMap
in Java. I need to do that by key but in my case the key is an object so I need to order by a specific field. Trying to figure it by my own I've considered to proceed with this simple scratch of code:
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;
}
Assuming that it works and I don't care about performance, before really use it, I wish to know if the next scratch of code could be better and most important: Why?
Example below source here: 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;
}
If both are wrong, how should I do that?
In java8, you can use following code:
yes ,
we can use TreeMap.
TreeMap foo = new TreeMap(myHashMap);
Best way is to use a
TreeMap
.TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);
If you need a custom comparator, you can use the
new TreeMap(Comparator c)
and then add the contents of theHashMap
there withfoo.putAll(myMap);
.You cannot control a
HashMap
's ordering, as you've seen. ALinkedHashMap
is just aHashMap
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 nameSortedMap
), and a couple of implementation, the most popular one being aTreeMap
. Just use it and let Java do all the heavy lifting: