java - for循环迭代不正确地填充arraylist

时间:2012-04-27 00:31:57

标签: java arraylist

我在过去两天尝试了一些代码,首先是map,然后是arrayLists。它是一个嵌套的for循环,我试图在循环迭代时填充数据结构。由于某种原因,它使用最后一次迭代的结果填充我的最终数据结构(arrayLists的arrayList,名为DataArrays2.getCinemaRowLayout2())。这意味着我添加的所有数组列表都是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

2 个答案:

答案 0 :(得分:5)

Java传递是通过对象引用,这意味着当您返回一个Object时,您将返回该Object的内存中的位置。因此,对于每次遍历该循环,您将修改相同的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);

答案 1 :(得分:2)

也许这个问题,Pass by value/reference, what?可以帮助您了解正在发生的事情......