How can you sort a LinkedHashMap using the value ?
Is there a way to insert entries into a LinkedHashMap so that they are inserted in order based on their value ?
How can you sort a LinkedHashMap using the value?
LinkedHashMap
is not sorted, it is ordered by order of insertion.
If your goal is to reorder the Map, you might do something like
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, final Comparator<? super V> c) {
List<Map.Entry<K, V>> entries = new ArrayList<>(m.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> lhs, Map.Entry<K, V> rhs) {
return c.compare(lhs.getValue(), rhs.getValue());
}
});
m.clear();
for(Map.Entry<K, V> e : entries) {
m.put(e.getKey(), e.getValue());
}
}
We put all the entries in a List, sort the List, then put the entries back in the Map in the new order.
Here's a Java 8 translation for those inclined:
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, Comparator<? super V> c) {
List<Map.Entry<K, V>> entries = new ArrayList<>(m.entrySet());
m.clear();
entries.stream()
.sorted(Comparator.comparing(Map.Entry::getValue, c))
.forEachOrdered(e -> m.put(e.getKey(), e.getValue()));
}
(Which, out of curiosity, can be condensed to, although it is less efficient):
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, Comparator<? super V> c) {
new ArrayList<>(m.keySet()).stream()
.sorted(Comparator.comparing(m::get, c))
.forEachOrdered(k -> m.put(k, m.remove(k)));
}
Is there a way to insert entries into a LinkedHashMap so that they are inserted in order based on their value?
No. See above. LinkedHashMap
is not sorted.
If your goal is to keep the Map sorted, you need to use a TreeMap
; however there are problems with doing so. Entries in the Map need to have unique values. See here and here.