import java.util.Comparator; import java.util.Map; public class ByValueComparator implements Comparator { Map<Object,Integer> base_map; public ByValueComparator(Map<Object,Integer> base_map) { this.base_map = base_map; } public int compare(Object arg0, Object arg1) { if(!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) { return 0; } if(base_map.get(arg0) < base_map.get(arg1)) { return 1; } else if(base_map.get(arg0) == base_map.get(arg1)) { return 0; } else { return -1; } } } import java.util.Comparator; import java.util.Map; public class ByValueComparator implements Comparator { Map<Object,Integer> base_map; public ByValueComparator(Map<Object,Integer> base_map) { this.base_map = base_map; } public int compare(Object arg0, Object arg1) { if(!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) { return 0; } if(base_map.get(arg0) < base_map.get(arg1)) { return 1; } else if(base_map.get(arg0) == base_map.get(arg1)) { return 0; } else { return -1; } } } Java代码 ByValueComparator bvc = new ByValueComparator(retMap); TreeMap sortedMap = new TreeMap(bvc); sortedMap.putAll(retMap); ByValueComparator bvc = new ByValueComparator(retMap); TreeMap sortedMap = new TreeMap(bvc); sortedMap.putAll(retMap); 但是TreeMap get和put的时候都会调用compare,如果有相同的value就歇菜了,后面的会覆盖前面的(但key不一样),显然不是我们要的! 正解: Java代码 /** * * @param map 需要按值排序的map * @param reverse 是否是倒序 * @return */ public static Map sortByValue(Map map , final boolean reverse){ List list = new LinkedList(map.entrySet()); Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { if(reverse){ return -((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); Map result = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); result.put(entry.getKey(), entry.getValue()); } return result; }