有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java for循环迭代错误地填充arraylist

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

这里可以看到两个迭代的示例,每个迭代都有不同的输入:[[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) 个答案

  1. # 1 楼答案

    也许这个问题可以帮助你理解发生了什么

  2. # 2 楼答案

    Java传递是通过对象引用进行的,这意味着当您返回一个对象时,您将返回该对象在内存中的位置。因此,对于该循环的每次运行,都要修改相同的ArrayList(CinemaRowLayout的属性)。如果希望每次都获得一个单独的实例,则必须从CinemaRowLayout的内容创建一个新的ArrayList,并将该集合添加到地图中。现在,你正在一次又一次地将同一个对象添加到地图中,然后对该对象进行更改

    或者,您可以使用DataArrays2。getCinemaLayout()每次返回一个新实例。如果是这样的话,您的内部循环将如下所示:

    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);