Java中对Map按key进行排序是非常简单的,使用TreeMap即可轻松地解决这个问题。但是有的时候我们想对Map按value进行排序。这种情况下排序就比较麻烦了。我们还是可以利用TreeMap进行,但这种情况下,作为参数传入TreeMap构造器的comparator需要具有按value比较大小的能力。具体代码实现如下:
- 方法一:
public class SortMapByValue {
public static Map<K, V> sortMap(Map<K, V> unsortedMap) {
Comparator<K> comparator = new ValueComparator<K, V>(unsortedMap);
TreeMap<K, V> result = new TreeMap<K, V>(comparator);
result.putAll(unsortedMap);
return result;
}
}
class ValueComparator<K, V extends Comparable<V>> implements Comparator<K> {
HashMap<K, V> map = new HashMap<K, V>();
public ValueComarartor(HashMap<K, V> map) {
this.map.putAll(map);
}
@Override
public int compare(K s1, K s2) {
return map.get(s1).compareTo(map.get(s2));
}
}
- 方法二:
public class SortMapByValue {
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet());
Collisions.sort(list, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
return (e1.getValue()).compareTo(e2.getValue());
}
});
Map<K, V> result = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
}