public class MapTest { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { if (o1.equals(o2)) { return 0; } else if (o1.equals("tom")) { return -1; } else { return 1; } } }); map.put("zhang san",100); map.put("li si",98); map.put("jack",88); map.put("mike",97); map.put("tom",62); Set<String> set = map.keySet(); for(String s : set) System.out.println(s+":"+map.get(s)); //这里为什么取出的zhang san对应的value值为null } }
应该是构造的comparator有问题,代码中只指定key等于tom返回-1,查询key的时候没法根据正确的排序查找
问题出在这个自定义的 Comparator 方法
注意到Comparator接口要求实现一个比较方法,它负责比较传入的两个元素a和b,
如果a<b,则返回负数,通常是-1,
如果a==b,则返回0,
如果a>b,则返回正数,通常是1。
TreeMap内部根据比较结果对Key进行排序。
其次,当使用字符串排序的时候,要使用自带的 compareTo 方法来进行排序 修复方法如下:
public class MapTest {
public static void main(String[] args) {
Map<String,Integer> map = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
map.put("zhang san",100);
map.put("li si",98);
map.put("jack",88);
map.put("mike",97);
map.put("tom",62);
Set<String> set = map.keySet();
for(String s : set){
System.out.println(s+":"+map.get(s));
}
//这里为什么取出的zhang san对应的value值为null
}
}
参考资料:
https://www.liaoxuefeng.com/wiki/1252599548343744/1265117109276544