2011-12-10 3 views
0

私はスキャナに読み込まれるintのファイルを作成しています。スキャナは5つのint値を保持するLinkedList of Jobを生成します。これらのジョブはMergeSortでソートされ、スケジュールされます。結果のスケジュールは、ファイルに数百があっても1つの値しか返しません。LLNodesを追加できないLinkedList

IterableとMergesortの両方が正しく機能していると判断しました。バグはLinkedListの作成のどこかにあります。

エラー領域までの私のコードが下に表示されます。

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

私はプログラムが失敗したところ、これがあると思う:私はそれが正しく頭を設定していることが確認さ

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

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

私のバグテストでは(上記のelseブロック内に配置):

すべての繰り返しで正常に印刷されました。

どのような考えですか?

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; 
    } 
} 
+0

はSEでこのクラスのLLNodeですか?私はこれまでにそれを聞いたことがないし、Googleの検索はそれが示唆されていません。また、エラーメッセージ**とは何ですか? – bdares

+0

私の教授が作成したLinkedListとLLNodeはありません。上記の質問を編集してコードを追加します。 –

+0

また、バグではなく、エラー(まだ専門用語ではあいまい)ではないと思います。だからエラーメッセージは、プログラムからの悪い出力。 –

答えて

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

スキャナから読み込まれたintのすべてがJobsに渡されました。 setOrdering()で比較可能なヘッドに置かれたインクルードジョブ –

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配列しか持たないことです。 それはあなたの意図ですか?

つまり、int配列は、ファイルの最後の5つの整数を格納しません。ループの中にある種のaddToList(ints)メソッドを含めるか、5つのint配列をArrayListに格納し、後でそれらをジョブを作成してリンクリストに追加するときに1つずつ取り出す必要があります。

+0

また、あなたの質問には関係しませんが、リンクされたリストに項目を追加するときにノードを作成する必要はありません。ノードの作成と内部のすべてのものは、リスト内で非表示にして処理する必要があります。 – Mr1159pm

+0

これはints []がwhile(s.hasNext()){を繰り返すたびに自身を破壊/再作成するように設計されています。 –

+0

次の反復では、LinkedListノードLLNode を作成するための新しい配列が作成されます。 LLNodeの要素が現在のints []の値を持つ新しいジョブである –

関連する問題