java中的Map集合自定义构造器

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