TreeMap基于紅黑樹排序的算法银受,默認(rèn)數(shù)據(jù)put進(jìn)來(lái)按照key的大小升序排序宾巍,如果需要改成按value排序渔伯,則自定義新的Comparator,重寫compare(Object, Object)方法即可选浑⌒看TreeMap的源碼可知,它實(shí)現(xiàn)了AbstractMap類的put(K, V)
方法读恃,put方法中調(diào)用compare(K, K)
,此方法會(huì)取構(gòu)造器傳進(jìn)來(lái)的Comparator疹吃,如果構(gòu)造器沒有傳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最后只能保留一個(gè)
// 如果想按照key倒序排序,return k2.compareTo(k1)即可
// 注意compareTo使用方法膛檀,如果是自定義的類,還需要實(shí)現(xiàn)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());
}
}
}