这个优先级队列逻辑java有什么问题?
当添加到此队列时,我不断收到一个空指针异常,尤其是使用percolate up时。我想我的设置有问题,但我想不出来。当我尝试添加东西时,我得到一个错误,我的IDE说这是一个空指针异常,并且是compare方法中的一个问题,这使我认为compare方法中的if-else语句指向一个空值。我不明白他们为什么会这样这个优先级队列逻辑java有什么问题?,java,Java,当添加到此队列时,我不断收到一个空指针异常,尤其是使用percolate up时。我想我的设置有问题,但我想不出来。当我尝试添加东西时,我得到一个错误,我的IDE说这是一个空指针异常,并且是compare方法中的一个问题,这使我认为compare方法中的if-else语句指向一个空值。我不明白他们为什么会这样 public class GenericHeap<E> { int size; int capacity = 10; public E[] heap; Comparator m
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);
}}
您将索引提前一步,堆[I]仍然为空 假设您正在添加第二项 @条目:大小==1 沿着else路径,设置heap[1]=e,然后将大小增加到2。然后调用percolateup2。注意这里I==2时会发生什么:
if (mycomparator.compare(heap[I / 2], heap[I]) == 1) {
您可以访问堆[2],当然还没有设置。NPE
以上就是为什么你会得到NPE…现在进一步推测。我真的不理解percolateup的逻辑,但我敢打赌问题在于你过于激进地提升了规模的价值。可能不是:
heap[size++] = e;
this.percolateup(this.size);
这可能会有帮助
heap[size] = e;
this.percolateup(this.size);
size++
另一方面,你有一种风格导致了这种混乱。在add中,您直接引用成员变量size size++。这没什么错;但是你转过身来,进入这个.size。编译器很高兴,但这种不一致的风格无助于您的理解。我个人更喜欢只使用这个。当绝对需要时,但这是个人喜好。那么,您是否在调试器中逐步完成了代码?这就是步骤1。您能提供堆栈跟踪吗?看起来您正在向队列中添加一个尚未实例化的对象。确保要添加到队列中的对象已实例化并具有有效引用。另外,您还没有在这里给出完整的代码。队列在哪里?堆是什么类型?当您执行heap[size++]时,如何确保您试图访问heap元素的对象确实存在?我编辑并添加了构造函数和实例变量。我意识到我需要添加一个增加容量的方法,但是当我的测试仪没有超过容量时,我就出现了错误。