一个关于比较器重写的问题,java



package java_practice;

import java.util.Collection;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
    public static TreeMap<String,Integer> tm;

    public static void main(String[] args) {
        //Comparator comparator;
        tm = new TreeMap(new TreeMapCompare());
        tm.put("lqx",12);
        tm.put("fqy",16);
        tm.put("znk",10);
        tm.put("jgdabc",20);
    }



    public static class TreeMapCompare implements   Comparator<String>{

        @Override
        public int compare(String key1, String key2) {
            Integer v1 = tm.get(key1);
            Integer v2 = tm.get(key2);
            return v1.compareTo(v2 )==0?
                    key1.compareTo(key2)    //如果value相等则比较key
                    :
                    v1.compareTo(v2 ); //如果value不等则按照value比较


        }
    }

}

img

兄弟,我在你上一个问题给你回复了

package org.jshand.itextpdf;

import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;

/**
 * 项目:commons
 * 创建时间:  2022-02-14   16:12
 * 作者 :金山
 * 描述 :
 */
public class TreeMapCompareDemo {

    /**
     * 全局map,便于比较器中使用
     */


    public static void main(String[] args) {
        Comparator comparator;
        HashMap<String,Integer> baseMap = new HashMap();
        baseMap.put("lqx",12);
        baseMap.put("fqy",16);
        baseMap.put("znk",10);
        baseMap.put("aa",15);
        baseMap.put("bb",15);
        baseMap.put("cc",20);
        baseMap.put("dd",20);
        baseMap.put("jgdabc",20);

        TreeMap tm = new TreeMap(new TreeMapCompare(baseMap));
        tm.putAll(baseMap);

        System.out.println(tm);
    }



    static class TreeMapCompare implements   Comparator<String>{
        private HashMap<String,Integer> baseMap = null;

        public TreeMapCompare(HashMap baseMap) {
            this.baseMap = baseMap;
        }

        @Override
        public int compare(String key1, String key2) {
            Integer v1 = baseMap.get(key1);
            Integer v2 = baseMap.get(key2);
            return v1.compareTo(v2 )==0?
                    key1.compareTo(key2)    //如果value相等则比较key
                          :
                    v1.compareTo(v2 ); //如果value不等则按照value比较


        }
    }

}




28行时因为11行静态对象没有赋值,所以程序加载的时候默认赋值为null,然后你用tm这个为null值的对象调用方法肯定就会报空指针。
建议:在11行的静态对象手动new对象赋值,防止空指针异常。public static TreeMap<String,Integer> tm== new TreeMap(new TreeMapCompare())

很明显是空指针异常了

img


调试的时候会发现v1的值为空,也就是get(key)方法找不到值,出现这个原因是在put源码中是先调用compare方法再创建键值对

img


也就是说,现在键值对还没放进map中,肯定找不到值了,v1则为null,也就报空指针异常了