TreeMap基于红黑树排序的算法,默认数据put进来按照key的大小升序排序,如果需要改成按value排序,则自定义新的Comparator,重写compare(Object, Object)方法即可。看TreeMap的源码可知,它实现了AbstractMap类的put(K, V)
方法,put方法中调用compare(K, K)
,此方法会取构造器传进来的Comparator,如果构造器没有传Comparator,则直接比较key的值。
// ValueComparator.java
import java.util.Comparator;
import java.util.Map;
public class ValueComparator implements Comparator<String> {
private Map<String, Integer> map;
public ValueComparator(Map<String, Integer> map) {
this.map = map;
}
public int compare(String k1, String k2) {
// value相同的情况下,如果是return 0,则不同的key最后只能保留一个
// 如果想按照key倒序排序,return k2.compareTo(k1)即可
// 注意compareTo使用方法,如果是自定义的类,还需要实现Comparable<T>接口
if(map.get(k1) >= map.get(k2)) {
return 1;
}else {
return -1;
}
}
}
// SortingHashMap.java
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class SortingHashMap {
public static TreeMap<String, Integer> getSortedHashMap(Map<String, Integer> map) {
ValueComparator vc = new ValueComparator(map);
TreeMap<String, Integer> tmap = new TreeMap<String, Integer>(vc);
tmap.putAll(map);
return tmap;
}
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 3);
map.put("b", 2);
map.put("c", 1);
TreeMap<String, Integer> tmap = getSortedHashMap(map);
for(Map.Entry<String, Integer> e: tmap.entrySet()) {
System.out.println(e.getKey() + " : " + e.getValue());
}
}
}