我正在创建一个int型文件,它被读入扫描器。扫描器生成一个作业的LinkedList,每个Job包含5个int值。然后使用归并排序对这些作业进行排序和调度。生成的调度将只返回一个值,即使文件中有数百个值。
我已经确定Iterable和归并排序都工作正常。这个bug是在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]);
每次迭代都成功打印。
任何想法吗?
p。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;
}
}
这段代码:
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型数组。这是你的本意吗?
换句话说,你的int数组存储的不超过文件的最后5个int值。您应该在循环中包含某种addToList(int)方法,或者将您的5个int数组存储在ArrayList中,然后在创建作业时逐个检索它们并将它们添加到链表中。
一晚上的睡眠绝对有助于解决这个问题…
代码块:
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);