2010-01-30 2 views
0

Я ввод этого текстового файла в командной строке:Хотя цикл не работает

800 5 10 
800 1 8 
800 7 7 
810 2 9 
845 2 10 
850 1 3 

первый столбец является время, то приоритет, то длина
выход сортируется по времени плюс длина, и следующий пункт выводится, если время пункта меньше или равно текущему времени, с наивысшим приоритетом происходит первый (да его запутанным, но его проект класса)

который будет:

Job: [800,1,8] Start time: 800 End time:808 
Job: [800,5,10] Start time: 800 End time:818 
Job: [810,2,9] Start time: 810 End time: 819 
Job: [800,7,7] Start time: 800 End time: 807 
Job: [845,2,10] Start time: 845 End time 855 
Job: [850,1,3] Start time: 850 End time: 853  

im с помощью связанного списка с методами очереди, называемыми event, и очереди с приоритетом, называемой queue
. Моя проблема в том, что цикл while while (event.size() != 0 && queue.size() != 0) не выполняется вообще.
Если я изменяю его на цикл while, я получаю ошибки исключения нулевого указателя, а (event.peek().time <= currentTime) и if (event.peek().time > currentTime) Я попытался исправить исключения нулевого указателя, добавив event.peek() != null, и он все еще не работает. Событие (связанный список) имеет в нем 6 объектов Job, поэтому я не знаю, почему event.peek() возвращает null.

import java.util.*; 
import java.io.*; 

public class pj2 
{ 
    Queue<Job> event = new LinkedList<Job>();//interface queue 
    PriorityQueue<Job> queue = new PriorityQueue<Job>(); 

    public static void main(String[] args) throws IOException 
    { 
     if (args.length != 1) 
     { 
      System.out.println("Usage: java pj2 jobs.txt"); 
      System.exit(0); 
     } 
     else 
      new pj2(args[0]); 
    } 

    public pj2 (String textFile) throws IOException 
    {  
     File file = new File(textFile); 
     if (!file.exists()) 
     { 
      System.out.println(textFile + " does not exist."); 
      System.exit(0); 
     } 

     //add time,priority,length to event queue 
     Scanner data = new Scanner(file); 
     while (data.hasNext()) 
     { 
      int time = Integer.parseInt(data.next()); 
      int priority = Integer.parseInt(data.next()); 
      int length = Integer.parseInt(data.next()); 
      Job temp = new Job(time,priority,length); 
      event.add(temp); 
     } 
     data.close(); 

     int currentTime = 0; 
     //loop through priority queue, outputting results 
     while (event.size() != 0 && queue.size() != 0) 
     { 
      if (queue.size() == 0) 
       currentTime = event.peek().time; 
      while (event.peek().time <= currentTime) 
      { 
       currentTime += event.peek().length; 
       queue.offer(event.poll()); 
      } 

      if (event.peek().time > currentTime) 
      { 
       currentTime = (event.peek().time + event.peek().length); 
       queue.offer(event.poll()); 
      } 

       System.out.println(queue.peek() + " Start time: " + queue.peek().time + " End time: " + (queue.peek().time + queue.peek().length)); 
       queue.poll(); 
     } 

    } 
} 

public class Job implements Comparable<Job> 
{ 
    int time, length, priority; 

    public Job(int time, int priority, int length) 
    { 
     this.time = time; 
     this.priority = priority; 
     this.length = length; 
    } 
    public int compareTo(Job that) 
    { 
     if (this.priority == that.priority) 
      return this.time - that.time; 
     return this.priority - that.priority; 
    } 
    public String toString() 
    { 
     return "[" + time + "," + priority + "," + length + "]"; 
    } 

} 

ответ

0

+1 к предыдущему указателю плаката к учебнику отладчика. Если вы посмотрите на значения, найденные при вычислении условия цикла, вы сможете мгновенно найти эту проблему. ("О, event.size()! = 0 & & queue.size()! = 0 является ложным, потому что queue.size()! = 0 ложно.")

Как правило, ваш мыслительный процесс для решения проблем например, это должно быть: «Если цикл while не выполняется, его условие ложно. Мне нужно выяснить, какая часть условия ложна. Оттуда я могу выяснить, является ли ошибка« предыдущей частью моей программы » делая это ложным, где это должно быть правдой », или« это не должно быть частью условия цикла ».

В этом случае вам требуется event.size()! = 0 AND queue.size()! = 0, но вы не добавляете ничего в очередь до цикла. Я думаю, вам нужно пересмотреть свои условия цикла.

0

При чтении входного файла вы заполните event список, но заполнение queue остается время цикла, так что ваше состояние:

while (event.size() != 0 && queue.size() != 0) 

никогда не будет верно, как очередь пуста. Так как вам нужно изменить свое состояние петли на:

while (event.size() != 0 || queue.size() != 0) 

для обработки информации, пока списке или очереди все еще хранит данные, или вы, возможно, придется разделить ваш цикл на 2 петли, один для заполнения очереди из списка , за которым следует очередь, использующая очередь для определения вашего ответа.

Смежные вопросы