LinkedList не удается добавить LLNodes - PullRequest
0 голосов
/ 10 декабря 2011

Я создаю файл целых чисел, который считывается в сканер. Сканер создает LinkedList of Job, каждый из которых содержит 5 значений типа int. Эти работы затем сортируются с помощью MergeSort и планируются. Результирующее расписание вернет только одно значение, даже если в файле есть сотни.

Я определил, что Iterable и Mergesort работают правильно. Ошибка где-то в создании LinkedList.

Мой код до области ошибки отображается ниже:

public JobSchedule makeSchedule(JobSchedule.Metric metric, Job.JobOrdering ordering){
  Scanner s = new Scanner(file);
  SortableLinkedList<Job> sortable = new SortableLinkedList<Job>();
  LLNode<Job> listptr = sortable.getHead();
  //reads the contents of file into a storage array and...
  // ...inputs the stored values as parameters for Job constructors
  while(s.hasNext()){
    int[] ints = new int[5];
    for(int i = 0; i<5; i++){
       ints[i]=s.nextInt();
    }

Я проверил, что он правильно устанавливает голову:

    if(sortable.getHead()==null){
       sortable.setHead(new LLNode<Job>(new Job(ints[0],ints[1],
              ints[2],ints[3],ints[4]),null));
       sortable.getHead().getElement().setOrdering(ordering);
       listptr = sortable.getHead();
    }

Я думаю, что здесь происходит сбой программы:

    else{
       listptr.setNext(new LLNode<Job>(new Job(ints[0],ints[1],
             ints[2],ints[3],ints[4]),null));
       listptr = listptr.getNext();
    }
  }

хотя в моем тестировании ошибок (помещенном в вышеупомянутом блоке else):

 System.out.println("Next:"+ints[0]+" "+ints[1]+" "+ints[2]+" "+ints[3]+" "+ints[4]);

Он успешно печатается при каждой итерации.

Есть мысли?

пс. Код LLNode и LinkedList:

public class LLNode<T>{  
  private T element;
  private LLNode<T> next;


  public LLNode(T element, LLNode<T> next){
    this.element = element;
    this.next = next;
  }

  public T getElement(){
    return this.element;
  }

  public LLNode<T> getNext(){
    return this.next;
  }

  public void setNext(LLNode<T> node){
    this.next=node;
  }
}



public class LinkedList<T>{
  private LLNode<T> head;

  public LinkedList(){
    head = null;
  }

  public LinkedList(LLNode<T> head){
    this.head = head;
  }

  public LLNode<T> getHead(){
    return head;
  }

  public void setHead(LLNode<T> node){
    this.head = node;
  }
}

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Ночной сон определенно помог с этой проблемой ...

кодовый блок:

else{
   listptr.setNext(new LLNode<Job>(new Job(ints[0],ints[1],
         ints[2],ints[3],ints[4]),null));
   listptr = listptr.getNext();
}

не включает команду setOrdering (упорядочение), необходимую для того, чтобы задания были сравнимы по сортировке слиянием.

Так что раньше:

listptr = listptr.getNext();

должно читаться следующим образом:

listptr.getNext().getElement().setOrdering(ordering);
1 голос
/ 10 декабря 2011

Этот фрагмент кода:

while(s.hasNext()){
 int[] ints = new int[5];
 for(int i = 0; i<5; i++){
    ints[i]=s.nextInt();
}

создает массив типа 5 int и, если в файле содержится больше целых чисел, он уничтожает вновь созданный массив и создает новый.Это продолжается до тех пор, пока в файле больше не будет int.В лучшем случае после завершения цикла while у вас есть только один массив 5 дюймов.Это было ваше намерение?

Другими словами, в вашем массиве int хранится не более 5 последних данных из файла.Вы должны либо включить какой-либо метод addToList (ints) в цикл, либо сохранить свои массивы 5 ints в ArrayList, а затем извлекать их один за другим при создании ваших заданий и добавлении их в связанный список.

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