Пока петля не работает - PullRequest
       12

Пока петля не работает

0 голосов
/ 30 января 2010

Я ввожу этот текстовый файл в командную строку:

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

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

, который выдаст:

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     

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

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 + "]";
    }

}

Ответы [ 2 ]

0 голосов
/ 30 января 2010

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

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

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

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

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

0 голосов
/ 30 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...