2012-05-08 10 views
0

次のスプリッタメソッドは、2つの独立したリンクリストのIntLinkedBag配列を返すように設計されています。これは、listSplitLessGreaterメソッドを呼び出すことでこれを実現し、整数のリンクリストの先頭参照とソートされた2つの新しいリンクリストの先頭参照を含むIntNode配列を返すスプリッタ整数値を渡します。 splitterメソッドは書かれたとおりに動作します。私はそれを働かせる唯一の方法でした。しかし、私はそれをコード化するためのより簡単な方法が必要であることを知っています。 * * // * ** * ** 間のすべてのプログラムを実行しているとき、私は私がnullポインタ免除エラーを受け取るないとき、私はこのリンクされたリストのヘッド参照をJavaのリンクリストオブジェクトに割り当てます。

newLists[0].head = answer[0]; 
newLists[1].head = answer[1]; 

と交換したいが。私の質問はなぜですか?このコードを書く正しい方法はなんですか?

public IntLinkedBag[] splitter(int target) 
{ 
    IntLinkedBag[] newLists = new IntLinkedBag[2]; 
    IntNode[] answer = new IntNode[2]; 
    answer = IntNode.listSplitLessGreater(head, target); 

    //********************************** 
    IntLinkedBag b = new IntLinkedBag(); 
    IntLinkedBag c = new IntLinkedBag(); 
    b.add(5); 
    b.head = answer[0]; 
    newLists[0] = b; 
    c.add(5); 
    c.head = answer[1]; 
    newLists[1] = c; 
    //********************************** 

    return newLists; 
} 

以下のようにコードを更新しました。私はエラーはありませんが、今は何も返されていません。テストコードでリンクリストが表示されていても、アイデアは?

このコードを追加すると動作しますが、なぜこの必要がありますか?

newLists[0].add(5); //adding a number to linked list to create a temporary head. 
newLists[1].add(5); //don't know why I have to have this but its only way code works correctly 

答えて

4

実際newlists[0]またはnewlists[1]の内部で初期化は何もありません。配列は作成時にデフォルト値nullを作成します。

はこのような何か試してみてください:

IntLinkedBag[] newLists = {new IntLinkedBag(), new IntLinkedBag()}; 

ループせずに同じことをしないこと:

IntLinkedBag[] newLists = new IntLinkedBag[2]; 
for(int i = 0; i < newLists.length; i++) { 
    newLists[i] = new IntLinkedBag(); 
} 

よりコンパクトに、あなたはこれを行うことができます。

+0

私はあなたが上記のようにしました。それ以上のアイデアは? – user1371651

+0

@ user1371651:あなたの編集については、この特定の質問では答えられません(コード作成のためのより良い方法を探していただけです)。新しい頭部を作成したり、 'add(int)'を呼び出さなければならない理由は、あなたが 'IntLinkedBag'クラスを実装した方法だけに依存します。最初に 'add(int)'を呼び出さない限り、何も返されません。なぜなら、なぜ具体的にその実装を見ることなく(なぜならこの時点ではあまりにも多すぎるかもしれません)なぜ答えることができないのかです。 – Makoto

+0

誠にありがとうございます! – user1371651

関連する問題