LinkedList无法添加LLNode

时间:2011-12-10 05:43:59

标签: java linked-list

我正在创建一个读入扫描仪的整数文件。扫描程序生成一个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();
    }
  }

虽然在我的bug测试中(放在上面的else块中):

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

每次迭代都成功打印出来。

有什么想法吗?

PS。 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 个答案:

答案 0 :(得分:1)

这段代码:

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

创建一个5 int数组,如果文件中有更多的int,它会销毁新创建的数组并创建一个新数组。它一直持续到文件中没有更多的int。  while循环结束后最好的情况是你只有一个5英寸的数组。 那是你的意图吗?

换句话说,你的int数组不会存储文件中最后5个整数。您应该在循环中包含某种addToList(ints)方法,或者将您的5个int数组存储在ArrayList中,然后在创建Jobs时将它们逐个检索并将它们添加到链接列表中。

答案 1 :(得分:1)

夜间睡眠肯定有助于解决这个问题...

代码块:

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);