这个优先级队列逻辑java有什么问题?

时间:2014-11-16 00:22:03

标签: java

添加到此队列时,我一直收到空指针异常,特别是在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);


}}

1 个答案:

答案 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()中,您直接引用成员变量sizesize++)。没有错;但随后你转身访问this.size。编译器很高兴,但这种不一致的风格并没有帮助你理解。 (当我绝对需要时,我个人更喜欢只使用“这个”。但那是个人品味。)