2 回答
TA贡献1827条经验 获得超8个赞
很明显,HashMap比较里面有没有条目"dd":只"xx","xz","cx",和"ax"映射。这就是在等于时this.map.get(k1)产生的原因。nullk1"dd"
之后你调用compareTo结果get
this.map.get(k1).compareTo(this.map.get(k2));
// ---------
它产生一个 NPE。
要解决此问题,请添加一些替代方法来比较映射中没有键的对象 - 例如,通过比较键本身:
public int compare(String k1, String k2){
System.out.printf("k1:%s k2:%s\n",k1,k2);//for debugging
Integer v1 = this.map.get(k1);
Integer v2 = this.map.get(k2);
if (v1 != null && v2 == null) {
return -1;
}
if (v1 == null && v2 != null) {
return 1;
}
return (v1 != null && v2 != null) ? v1.compareTo(v2) : k1.compareTo(k2);
}
TA贡献1851条经验 获得超3个赞
问题出现在这里 return this.map.get(k1).compareTo(this.map.get(k2));
您已经预定义了地图,this.map=map;但是如果您添加一个元素,则会调用比较器。但是由于该元素不在地图上还this.map.get(k1)返回null。这就是为什么你得到null.compareTo(...)导致异常的原因。
添加回答
举报
