对象作为java 8中treemap中的键

时间:2015-06-17 05:52:02

标签: java java-8 treemap

CompareObj是java中的一个类它由三个属性String rowKey, Integer hitCount, Long recency

组成
public CompareObj(String string, Integer i) {


    this.rowKey = string;
    this.hitCount = i%10;
    this.recency= (Long) i*1000;
}

现在我创建了一个treeMap

Comparator<CompareObj> comp1 = (e1,e2) -> e1.getHitCount().compareTo(e2.getHitCount());
    Comparator<CompareObj> comp2 = (e1,e2) -> e2.getRecency().compareTo(e1.getRecency());
    Comparator<CompareObj> result = comp1.thenComparing(comp2);
    TreeMap<CompareObj, CompareObj> tM = new TreeMap<CompareObj, CompareObj>(result);

    for(int i=0;i<=1000;i++)
    {

        CompareObj cO = new CompareObj("A"+i, i);
        tM.put(cO,cO);
    }


    for(int i=0;i<=1000;i++)
    {

        CompareObj cO = new CompareObj("A"+i, i);
        CompareObj values = tM.get(cO);
        System.out.println(values.getRowKey()); // Line 28: get Null Pointer Exception
    }

另外我覆盖了hashCode和Equals。我仍然得到nullponter异常。

@Override
public int hashCode() {
    return  Objects.hash(getRowKey());
}
@Override
public boolean equals(Object obj) {
    if(this==obj) return true;
    if(!(obj instanceof CompareObj)) return false;
    CompareObj compareObj = (CompareObj) obj;
    return Objects.equals(this.getRowKey(), compareObj.getRowKey());
}

这里当我尝试从树形图中回溯值时,我在上面提到的行中得到Null Pointer异常。如何解决这个问题

如果我想实现Comaprable接口的comapareTo(),如果有多个排序条件,我应该如何实现。

1 个答案:

答案 0 :(得分:2)

首先要理解的是NullPointerException。如果你在确切的行上得到了那个例外

System.out.println(values.getRowKey());

然后System.outvaluesnull。由于我们可以排除System.outnull,因此它是values变量,其中包含get的结果,如果查找失败,则可以是null

由于您使用自定义TreeMap初始化Comparator,因此Comparator确定了相等性。您的Comparator基于必须匹配的属性getHitCount()getRecency(),这意味着当查找失败时,地图不包含具有与这些相同的值的对象两种方法。

您显示构造对象具有相同的值但不是这些getter的代码。必须存在不一致。作为Misha pointed out,您发布的代码不能是您在获取异常时运行的代码,因此我们无法帮助您(除非您发布您运行的真实代码)。