当密钥是不同的实例时,Java Treemap比较器忽略get

时间:2016-12-12 23:09:00

标签: java nullpointerexception comparator treemap instances

我遇到的问题是,当密钥与TreeMap中的密钥不同时,get方法会抛出NPE。

public class ConjuntDocuments {

private TreeMap<Capcalera, Document> almacen;
private ArrayList<Pair_plantilla> plantilla;

ConjuntDocuments() {
    almacen = new TreeMap<Capcalera, Document>(new CustomComparator());
    plantilla = new ArrayList<Pair_plantilla>();
}

private static class CustomComparator implements Comparator<Capcalera> {
    @Override
    public int compare(Capcalera c1, Capcalera c2) {
        int ax = c1.get_tit().get_nom().compareFrase(c2.get_tit().get_nom());
        if (ax < 0) return -1;
        else if (ax > 0) return 1;
        //titols iguals
        else {
            ax = c1.get_au().get_nom().compareFrase(c2.get_au().get_nom());
            if (ax < 0) return -1;
            else if (ax > 0) return 1;
        }
        //titols i autors iguals
        return 0;
    }
}

compareFrase比较ArrayLists(Paraula) - &gt; FraseParaula就像一个字符串,get_chars返回String

public int compareFrase(Frase f) {

    for(int i=0; i<min(this.get_size(), f.get_size()); ++i){
        int aux = this.get_paraula(i).get_chars().compareTo(f.get_paraula(i).get_chars());
        if(aux < 0) return -1;
        else if(aux > 0) return 1;
    }
    if(this.get_size() < f.get_size()) return -1;
    else if(this.get_size() > f.get_size()) return 1;
    return 0;
}

Titol和autor是Frases - &gt;的ArrayList(Paraula)

public class Capcalera {
private Titol tit;
private Autor au;

因此,在尝试解决这个问题之后,我已经意识到get方法只有在引用的键与映射的键相同时才会起作用,就在输入一个条目后almacen.put(capcalera,document),如果我尝试调用almacen.get(Capcalera)它会正确返回值,但是如果我创建一个新的Capcalera,它会抛出NPE。我假设比较器存在问题但是由于条目排序正确,我无法弄清楚出了什么问题。

编辑:

我已经从Capcalera实现了.equals和.hashcode,但我可能做错了,因为来自Treemap的.get仍然会抛出NPE。

@Override
public int hashCode() {
    int hashTitol = tit != null ? tit.hashCode() : 0;
    int hashAutor = au != null ? au.hashCode() : 0;

    return (hashTitol + hashAutor) * hashAutor + hashTitol;
}

@Override
public boolean equals(Object other) {
    if (other instanceof Capcalera) {
        Capcalera otherCapcalera = (Capcalera) other;
        return
                (( this.get_tit().get_nom().equalsFrase(otherCapcalera.get_tit().get_nom()) ||
                        ( this.get_tit() != null && otherCapcalera.get_tit() != null &&
                            this.get_tit().get_nom().equalsFrase(otherCapcalera.get_tit().get_nom()) )) &&
                        ( this.get_au().get_nom().equalsFrase(otherCapcalera.get_au().get_nom()) ||
                                ( this.get_au() != null && otherCapcalera.get_au() != null &&
                                    this.get_au().get_nom().equalsFrase(otherCapcalera.get_au().get_nom()))) );
    }
    return false;
}
如果Titol / Autor等于

,则

equalsFrase返回true

public boolean equalsFrase(Frase f) {
    for(int i=0; i<min(this.get_size(), f.get_size()); ++i){
        int aux = this.get_paraula(i).get_chars().compareTo(f.get_paraula(i).get_chars());
        if(aux < 0) return false;
        else if(aux > 0) return false;
    }
    if(this.get_size() < f.get_size()) return false;
    else if(this.get_size() > f.get_size()) return false;
    return true;
}

0 个答案:

没有答案