0

在过去的两天里,我一直在尝试让一些代码工作,首先是地图,然后是 arrayLists。这是一个嵌套的 for 循环,我试图在迭代循环时使用它来填充数据结构。出于某种原因,它正在用最后一次迭代的结果填充我的最终数据结构(一个名为 DataArrays2.getCinemaRowLayout2() 的 arrayLists 的arrayList)。我的意思是所有添加的数组列表都是最终迭代的所有副本。我不知道为什么会这样!

可以在此处看到 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 回答