Java中PriorityQueue类的添加操作
我正在尝试用Java实现PriorityQueue。我有一个PrinterQueue类,它包括PriorityQueue和TestPrinterQueue类,用于测试它。PrintJob是此队列中的类型。构造函数是私有的,所以我使用反射来实现对象的实例 运行时出现的问题是,我无法向队列中添加多个对象。队列的大小始终相同。没有编译错误。所有代码如下。谢谢你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
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函数中,我不会从主队列中删除元素。我将它们从临时队列中删除,该队列与另一个队列相等。。我将再次检查。您不是在创建临时队列,只是对原始队列的另一个引用。