当前位置: 首页 > 知识库问答 >
问题:

我是第一次使用优先级队列,但我的代码格式错误。优先级队列代码中的错误是什么?

秦鹏飞
2023-03-14

输出框中的错误是:线程“main”java.lang.NullPointerException中的异常:无法分配字段“value”,因为“this.priorityqueue[this.count]”在Main.mainPriorityQueue.enQueue(PriorityQueue.java:16)为空(Main.java: 4)

它具有入队、出队、查看优先级队列等操作。主要显示排队部分的错误。

public class PQ {
    public int value;
    public int priority;
}

public class PriorityQueue {
    public PQ[] priorityqueue;
    public int count;
    
    public PriorityQueue(int size){
        this.count = 0;
        this.priorityqueue = new PQ[size];
        System.out.println("The Priority Queue is create with the size of :" + size);
    }

    public void enQueue(int element,int priority){
        if (count == priorityqueue.length){
            System.out.println("Priority Queue Overflow!");
        }
        else {
            priorityqueue[count].value = element;
            priorityqueue[count].priority = priority;
            count++;
        }
    }
    
    public int peekprio(){
        int max = Integer.MIN_VALUE;
        int index = -1;
        for (int i = 0;i < count;i++){
            if (priorityqueue[i].priority > max){
                max = priorityqueue[i].priority;
                index = i;
            } else if (priorityqueue[i].priority == max && index > -1 && priorityqueue[index].value < priorityqueue[i].value){
                index = i;
            }
        }
        return index;
    }
    
    public int peek(){
        if (count == 0){
            System.out.println("Priority Queue Underflow!");
            return -1;
        }
        else {
            int index = -1;
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < count; i++) {
                if (priorityqueue[i].priority > max) {
                    max = priorityqueue[i].priority;
                    index = i;
                }
                else if (priorityqueue[i].priority == max && index > -1 && priorityqueue[index].value < priorityqueue[i].value){
                    index = i;
                }
            }
            return priorityqueue[index].value;
        }
    }

    public void deQueue(){
        if (count == 0){
            System.out.println("Priority Queue Underflow!");
        }
        else {
            int element = priorityqueue[peekprio()].value;
            int index = peekprio();
            for (int i = index;i < count;i++){
                priorityqueue[i] = priorityqueue[i + 1];
            }
            count--;
            System.out.println("Value deQueued :" + element);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        PriorityQueue pq = new PriorityQueue(5);
        pq.enQueue(1,0);
        pq.enQueue(3,3);
        pq.enQueue(5,5);
        pq.enQueue(2,2);
    }
}

共有1个答案

靳高明
2023-03-14

您正在使用一个 PQ 对象数组在内部对优先级队列进行建模,但是您缺少 PQ 对象本身的创建,因此当您尝试为队列分配值和优先级时,它会尝试将其设置为尚不存在的对象。

执行此操作时:<code>此。优先级队列=新PQ[大小]在构造函数中,您只创建数组,当您不想将单个对象添加到数组中时,仍然需要创建它们。

为此,请更改< code>enQueue方法的这一部分,以添加< code>new PQ():

else {
   priorityqueue[count] = new PQ();
   priorityqueue[count].value = element;
   priorityqueue[count].priority = priority;
   count++;
}

理想情况下,您希望在PQ类上为其创建构造函数,而不是直接从外部设置属性。

希望这有帮助。

 类似资料:
  • 所以我找到了这段代码,我真的很想了解这段代码是如何工作的,以及在里面传递这个值的用法 "( )".

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 本文向大家介绍什么是Java优先级队列(Priority Queue)?相关面试题,主要包含被问及什么是Java优先级队列(Priority Queue)?时的应答技巧和注意事项,需要的朋友参考一下 考察点:队列 PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。Priori

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。