添加到此队列时,我一直收到空指针异常,特别是在percolate up时。我认为我的设置出了问题,但我无法理解。当我尝试添加内容时,我收到错误,我的IDE说它是一个空指针异常,比较方法中存在问题,让我认为compare方法中的if else语句指向null值。我无法弄清楚他们为什么会这样做?
public class GenericHeap<E> {
int size;
int capacity = 10;
public E[] heap;
Comparator mycomparator;
public GenericHeap(Comparator c) {
heap = (E[]) new Object[capacity];
mycomparator = c;
}
public void add(E e) {
if (size == 0) {
heap[size++] = e;
} else {
heap[size++] = e;
this.percolateup(this.size);
}
}
private void percolateup(int I) {
E temp;
while (I / 2 > 0) {
if (mycomparator.compare(heap[I / 2], heap[I]) == 1) {
temp = heap[I / 2];
heap[I / 2] = heap[I];
heap[I] = temp;
}
I = I / 2;
}
}
public int compare(String t, String t1) {
if (t.length()>t1.length()){
return 1;}
else if (t.length()<t1.length()){
return -1;}
return t.compareTo(t1);
}}
答案 0 :(得分:0)
你的索引提前了一步,堆[I]仍为空。
假设您要添加第二项。
@entry:size == 1
你沿着其他路径走,设置heap[1]=e
,然后将大小增加到2.然后调用percolateup(2)
。注意当我在这里= = 2时会发生什么:
if (mycomparator.compare(heap[I / 2], heap[I]) == 1) {
您访问heap[2]
,当然还没有设置。 NPE!
以上肯定是你获得NPE的原因......现在进一步推测。我并不真正理解percolateup()的逻辑,但我敢打赌,问题是你是否过于激进地提升了大小的价值。可能不是:
heap[size++] = e;
this.percolateup(this.size);
这可能会有所帮助
heap[size] = e;
this.percolateup(this.size);
size++
另外,你有一种风格可以解决这种混乱。在add()
中,您直接引用成员变量size
(size++
)。没有错;但随后你转身访问this.size
。编译器很高兴,但这种不一致的风格并没有帮助你理解。 (当我绝对需要时,我个人更喜欢只使用“这个”。但那是个人品味。)