2012-04-27 6 views
0

マップと配列リストを使用してコードを実行するために、ここ2日間は試してみました。これは、ループが繰り返されるときにデータ構造体にデータを取り込もうとしているネストされたforループです。なんらかの理由で、最後のデータ構造(DataArrays2.getCinemaRowLayout2()というarrayListのarrayList)に最後の繰り返しの結果が入り込んでいます。これにより、追加されたすべてのarrayListsがFINAL反復のすべての重複であることを意味します。なぜこれが起こっているのか分かりません!java-forループの反復でarraylistが正しく設定されない

[[o、o、o、o]、[o、o、o、o]]ここでは、入力が異なる2つの繰り返しの例を示します。私はそれが使用するのに最適な構造ではないかもしれないことに感謝しますが、私は時間がないので、私の謝罪を受け入れてください。

ご迷惑をおかけして申し訳ありません。

for (int i=0; i<Screens.rows; i++){//for loop of screen rows 

    System.out.println("Please enter how many seats and blank spaces in this row"); 
    Screens.columns = Integer.valueOf(scanInValue.next()); 

     for(int j=0; j<Screens.columns; j++){//for loop of seats in row 
     System.out.println("Please enter 'o' for a seat or press enter for a space"); 
     in = scanInValue.next(); 
     DataArrays2.getCinemaRowLayout().add(j, in);//seats in a row arraylist 
     } 
DataArrays2.getCinemaRowLayout2().add(i, DataArrays2.getCinemaRowLayout());//arraylist of row arraylists 
DataArrays2.getCinemaRowLayout().clear();//clears seats arrayList 

} 
DataArrays2.getScreenMapLayout().put(showingName, DataArrays2.getCinemaRowLayout2());//map of arraylists 
BookingSystem2.saveShowing(DataArrays2.getScreenMapLayout()); //saves map to file 

答えて

5

Javaの渡しはオブジェクト参照によるものです。つまり、オブジェクトを返すと、そのオブジェクトのメモリ内の位置が返されます。そのループを実行するたびに、同じArrayList(CinemaRowLayoutのプロパティ)を変更しています。毎回別のインスタンスを取得する場合は、CinemaRowLayoutの内容から新しいArrayListを作成し、NEWコレクションをマップに追加する必要があります。今は同じオブジェクトをマップに何度も追加してから、そのオブジェクトを変更します。

また、DataArrays2.getCinemaLayout()に毎回新しいインスタンスを返させることもできます。その場合は、あなたのinnerLoopは次のようになります:

ArrayList<whatever> temp = new ArrayList<whatever>(); 
for(int j=0; j<Screens.columns; j++){//for loop of seats in row 
    System.out.println("Please enter 'o' for a seat or press enter for a space"); 
    in = scanInValue.next(); 
    temp.add(j, in);//seats in a row arraylist 
} 
DataArrays2.getCinemaRowLayout2().add(i, tmp); 
+0

感謝を助けることができます!あなたは「参照は通り過ぎている」ということをさらに説明できますか? CinemaRowLayoutのarrayListがクリアされ、それぞれの試みが異なるように設定されている場合、ループインデックス 'i'がすべての繰り返しで同じ結果を生成する方法は見当たりません...そして、それはすべての前回の反復の結果ちょうど私を困惑させる試み! – Dan

+0

@ダンあなたはポインタに精通していますか? Javaでオブジェクトを渡すたびに、ポインタ(または参照)をメモリ内のそのオブジェクトの場所に渡しています。つまり、実際にマップに追加しているのは最後にarrayListへのポインタですが、マップに追加したすべてのポインタは同じ場所を指しています!だから、あなたが指示されている場所で何かを修正するときはいつでも、その修正はメモリ内の同じ場所を指しているので、その参照にアクセスするどこにでも表示されます – JRaymond

+0

涼しい、それは今意味があります!ありがとう!毎回新しいインスタンスを作成する方法に関するアドバイスはありますか? – Dan

2

はおそらく、この質問は、Pass by value/reference, what?は...あなたは何が起こっているかを理解すること

+0

を指しています。 – Dan

関連する問題