我有一个学校项目,要求我创建一个Printer类,代表将接收和处理打印作业的打印机。
其他所有内容似乎都运行良好,但我的process()
方法似乎无法正常工作。它处理并删除请求的打印作业,但在size() == 0
(每个托盘最初设置为容纳100页)时似乎不会停止处理打印作业。
如果没有纸张或size() == 0
,则不应打印任何内容,并将该未处理的作业放回队列的末尾。请告诉我这里我做错了什么。非常感谢您的帮助。谢谢!
Printer.Java。 process()方法
public Printer() {
white = new PaperTray("White", "white", 100);
yellow = new PaperTray("Yellow", "yellow", 100);
printJobQ = new LinkedUnbndQueue<PrintJob>();
}
//...
/*
* if the tray is empty then the job will not be processed
* and will be added back to the end of the queue.
*/
public PrintJob process() {
PrintJob currentJob = new PrintJob();
try {
// make a reference to the dequeue job
currentJob = printJobQ.dequeue();
// remove the number of pages used for printing
// from the appropriate tray
if((currentJob.getColor().equalsIgnoreCase("white")) && (white.size() != 0)) {
white.remove(currentJob.getNumberOfPage());
} else if((currentJob.getColor().equalsIgnoreCase("yellow")) && (yellow.size() != 0)) {
yellow.remove(currentJob.getNumberOfPage());
// add unprocessed print job back to the queue***
} else if((white.size() == 0) || (yellow.size() == 0)) {
printJobQ.enqueue(currentJob);
}
} catch (QueueUnderFlowException e) {
//...
} catch (PaperUnderFlowException e) {
//...
}
// return the info of the processed print job
return currentJob;
}
PaperTray.java
// private int numberOfPage;
//...
public int size() {
if(numberOfPage <= 0) {
return 0;
} else if(numberOfPage >= 100) {
return 100;
} else {
return numberOfPage;
}
}
//remove paper when print
public void remove(int paper) throws PaperUnderFlowException {
numberOfPage = numberOfPage - paper;
if(numberOfPage < 0) {
throw new PaperUnderFlowException("Paper under flow. Tray is empty");
}
}
LinkedUnbndQueue.java
// private LLNode front, rear;
//...
public T dequeue() throws QueueUnderFlowException {
if(isEmpty()) {
throw new QueueUnderFlowException("Dequeue attempted on an empty queue");
}
else {
T elementToRemove = front.getInfo();
front = front.getLink();
if(front == null)
rear = null;
return elementToRemove;
}
}
答案 0 :(得分:0)
只是几个快速管家的事情。确保您不仅仅是在本网站上发布您的作业问题。我们不是来做你的工作。
其次要确保您不只是发布所有代码。仅发布相关内容并在以后根据需要添加信息。我们无法读取您的所有代码并为您调试。
最后回答你的问题。
T elementToRemove = front.getInfo();
front = front.getLink();
if(front == null)
rear = null;
return elementToRemove;
}
}
这部分似乎并没有实际出列任何东西。你永远不会把元素拿走。你只需返回一个前面的元素。
免责声明:这只是在粗略查看您的代码之后,所以请花点时间确保您的链接列表实际上正在被正确操作。
答案 1 :(得分:0)
我想我明白了。而不是
else if((white.size() == 0) || (yellow.size() == 0)) {
printJobQ.enqueue(currentJob);
}
应该是
if((currentJob.getColor().equalsIgnoreCase("white")) && (white.size() != 0)) {
if((white.size() - currentJob.getNumberOfPage()) <= 0)
printJobQ.enqueue(currentJob);
white.remove(currentJob.getNumberOfPage());