0

私は過去2日間、最初にマップを使用し、次にarrayListsを使用して、コードを機能させることを試みました。これはネストされたforループであり、ループが繰り返されるときにデータ構造にデータを入力しようとしています。何らかの理由で、最後の反復の結果で最終的なデータ構造(DataArrays2.getCinemaRowLayout2()と呼ばれるarrayListのarrayList)を埋めています。これは、追加されたすべてのarrayListがFINAL反復のすべての複製であることを意味します。なぜこれが起こっているのか分かりません!

それぞれ異なる入力を持つ2回の反復の例をここで見ることができます:[[o、o、o、o]、[o、o、o、o]]。使用するのに最適な構造ではないかもしれませんが、時間が不足しているので、お詫び申し上げます。

どんな助けでも大歓迎です!

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
4

2 に答える 2

5

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

または、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);
于 2012-04-27T00:36:57.440 に答える
2

おそらくこの質問、値/参照を渡す、何ですか?何が起こっているのかを理解するのに役立ちます...

于 2012-04-27T00:43:21.420 に答える