Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中PriorityQueue类的添加操作_Java_Eclipse_Runtime Error_Priority Queue_User Defined Types - Fatal编程技术网

Java中PriorityQueue类的添加操作

Java中PriorityQueue类的添加操作,java,eclipse,runtime-error,priority-queue,user-defined-types,Java,Eclipse,Runtime Error,Priority Queue,User Defined Types,我正在尝试用Java实现PriorityQueue。我有一个PrinterQueue类,它包括PriorityQueue和TestPrinterQueue类,用于测试它。PrintJob是此队列中的类型。构造函数是私有的,所以我使用反射来实现对象的实例 运行时出现的问题是,我无法向队列中添加多个对象。队列的大小始终相同。没有编译错误。所有代码如下。谢谢你 PrinterQueue class: import java.util.Comparator; import java.util.Prio

我正在尝试用Java实现PriorityQueue。我有一个PrinterQueue类,它包括PriorityQueue和TestPrinterQueue类,用于测试它。PrintJob是此队列中的类型。构造函数是私有的,所以我使用反射来实现对象的实例

运行时出现的问题是,我无法向队列中添加多个对象。队列的大小始终相同。没有编译错误。所有代码如下。谢谢你

PrinterQueue class:

import java.util.Comparator;
import java.util.PriorityQueue;

public class PrinterQueue{
   private static PrinterQueue queue;
   PriorityQueue<PrintJob> pqExample;
   Comparator<PrintJob> Comparator;
   int iQueueSize = 50;

   private PrinterQueue(){
      Comparator = new Priority();
      pqExample = new PriorityQueue<PrintJob>(iQueueSize,Comparator);
  }
   public static PrinterQueue getQueue(){
      if (queue==null) queue = new PrinterQueue();
     return queue;} 

   public void addJob (PrintJob job) {
       queue = new PrinterQueue();
       queue.pqExample.add(job);
     // Use the job’s getPriority method to check its priority. PRIORITY CLASSINDA KULLANILDI.
     System.out.println("Job " + job.getName() + " is added to the printer queue" + " Size: " + queue.pqExample.size());
     Print();
  }
  public boolean isEmpty(){
      if(queue.pqExample.isEmpty())
          return true;
      else
          return false;
  }
  public PrintJob removeJob(){
      //TODO –remove the highest priority job from the queue
      PrintJob job = queue.pqExample.remove();
      System.out.println("Job "+ job.getName()+ "has been printed");
      return job;

  }
  public boolean isFull(){
      if (queue.pqExample.size() == iQueueSize)
          return true;
      else
          return false;
  }
  private void Print() {

      PriorityQueue<PrintJob> pqTemp;
      pqTemp = queue.pqExample;

       while (pqTemp.size() != 0)
       {
           System.out.println(queue.pqExample.element());
           System.out.println("//");
           pqTemp.remove();
       }
  }
}
PrinterQueue类:
导入java.util.Comparator;
导入java.util.PriorityQueue;
公共类PrinterQueue{
私有静态打印队列;
优先队列示例;
比较器;
int IQUEUSIZE=50;
私有PrinterQueue(){
比较器=新优先级();
pqExample=新优先级队列(iQueueSize,比较器);
}
公共静态PrinterQueue getQueue(){
如果(queue==null)queue=new PrinterQueue();
返回队列;}
public void addJob(PrintJob作业){
队列=新的PrinterQueue();
queue.pqExample.add(作业);
//使用作业的getPriority方法检查其优先级。优先级CLASSINDA KULLANILDI。
System.out.println(“作业”+Job.getName()+”被添加到打印机队列“+”大小:“+queue.pqExample.Size());
打印();
}
公共布尔值为空(){
if(queue.pqExample.isEmpty())
返回true;
其他的
返回false;
}
公共PrintJob removeJob(){
//TODO–从队列中删除优先级最高的作业
PrintJob job=queue.pqExample.remove();
System.out.println(“作业”+Job.getName()+“已打印”);
返回工作;
}
公共布尔值isFull(){
if(queue.pqExample.size()==iQueueSize)
返回true;
其他的
返回false;
}
私人作废打印(){
优先队列pqTemp;
pqTemp=queue.pqExample;
而(pqTemp.size()!=0)
{
System.out.println(queue.pqExample.element());
System.out.println(“/”);
pqTemp.remove();
}
}
}
TestPrinterQueue类:

import java.lang.reflect.Constructor;
import java.util.Scanner;

public class TestPrinterQueue {

    public static void main (String[] args) throws Exception {

        Constructor<PrinterQueue> constructor = PrinterQueue.class.getDeclaredConstructor(new Class[0]);
        constructor.setAccessible(true);

        PrinterQueue pqTest = constructor.newInstance(new Object[0]);

        @SuppressWarnings("resource")
        Scanner scUserInput = new Scanner(System.in);

        while (true)
        {
             PrintJob pjWillbeAdded = new PrintJob();

             System.out.println("Enter the priority:");
             pjWillbeAdded.setPriority(scUserInput.nextInt());
             System.out.println("Enter the JobName:");
             pjWillbeAdded.setName(scUserInput.next());
             System.out.println("Enter the Number of Pages in PrintJob:");
             pjWillbeAdded.setiNoPJ(scUserInput.nextInt());

             pqTest.addJob(pjWillbeAdded);

             System.out.println("**** TEST SIZE : " + pqTest.pqExample.size() + "*****");
        }
    }
}
import java.lang.reflect.Constructor;
导入java.util.Scanner;
公共类TestPrinterQueue{
公共静态void main(字符串[]args)引发异常{
构造函数=PrinterQueue.class.getDeclaredConstructor(新类[0]);
constructor.setAccessible(true);
PrinterQueue pqTest=constructor.newInstance(新对象[0]);
@抑制警告(“资源”)
扫描仪scUserInput=新扫描仪(System.in);
while(true)
{
PrintJob pjWillbeAdded=新的PrintJob();
System.out.println(“输入优先级:”);
pjwillbeaded.setPriority(scUserInput.nextInt());
System.out.println(“输入作业名:”);
pjwillbeaded.setName(scUserInput.next());
System.out.println(“输入PrintJob中的页数:”);
pjwillbeaded.setiNoPJ(scUserInput.nextInt());
pqTest.addJob(pjwillbeaded);
System.out.println(“****测试大小:”+pqTest.pqExample.SIZE()+“****”);
}
}
}

我希望这些信息足以解释我的问题。

在addJob()方法中,每次都将队列分配给一个新的PrinterQueue对象。将此更改为“queue=getQueue()”应该可以解决此问题。

谢谢,我很抱歉这样做了,但它不起作用。大小还是一样的。。试着找出答案谢谢你的回答,但我发现错误发生在不同的地方。这是由Print函数引起的。哎哟,不确定从哪里开始,但是,每次向队列添加内容时,也会通过调用Print()将其清空。这可能是你看到的恒定尺寸的原因。伙计,非常感谢你,现在它工作得很好!但我仍然不理解这个机制,因为在Print函数中,我不会从主队列中删除元素。我将它们从临时队列中删除,该队列与另一个队列相等。。我将再次检查。您不是在创建临时队列,只是对原始队列的另一个引用。