这是我在Stack上的第一个问题!我使用add方法填充了一个带有arraylists的2d arraylist的小问题。将我的第一个arraylist添加到2d arraylist并尝试重新填充SAME 1d arraylist后,再次将这个1d arraylist添加到2d arraylist似乎改变了我添加的2d arraylist的第一个元素...
ArrayList<ArrayList<String>> twoDArray = new ArrayList<ArrayList<String>>();
ArrayList<String> oneDArray = new ArrayList<String>();
oneDArray.add("a");
twoDArray.add(oneDArray);
System.out.println("First element in twoDArray: " + twoDArray.get(0)); //prints [a]
twoDArray.add(oneDArray);
oneDArray.clear();
oneDArray.add("b");
twoDArray.add(oneDArray);
System.out.println("First element in twoDArray:" + twoDArray.get(0)); //prints [b]
实际上,oneDArray实际上是迭代器中的局部变量,因此我试图重用它。我向oneDArray添加元素,当一个check返回true时,我将oneDArray添加到twoDArray,清空oneDArray,然后继续此过程,创建一个列表列表。
这是否与twoDArray.get(0)实际上持有指向oneDArray的指针,而不是它的实际值?如果是这样,我该如何解决这个问题呢?
非常感谢任何帮助:)
编辑:上述问题的解决方案
ArrayList<ArrayList<String>> twoDArray = new ArrayList<ArrayList<String>>();
ArrayList<String> oneDArray = new ArrayList<String>();
oneDArray.add("a");
twoDArray.add(new ArrayList<String>()); // Create new arraylist inside twoDArray
twoDArray.get(0).add(oneDArray.get(0)); // Populate new arraylist rather than hold reference to oneDArray
oneDArray.clear();
oneDArray.add("b");
twoDArray.add(new ArrayList<String>());
twoDArray.get(1).add(oneDArray.get(0));
答案 0 :(得分:0)
是的,如果你没有在循环中创建oneDArray,只是清除它将覆盖每次迭代,这就是元素丢失的原因。这确实是因为你对同一个内部arraylist有相同的引用。你应该在你的循环中ArrayList<String> innerToBeAdded = new ArrayList<>()
条件创建一个新的arraylist。
答案 1 :(得分:0)
你说“我将oneDArray添加到twoDArray,清空oneDArray,然后继续此过程,创建列表列表”,但你真正在做的是多次向twoDArray添加相同的数组。因为完全相同的数组被多次添加到twoDArray,当你清除()它时,它会清除所有值,当你向oneDArray添加一个值时,它将出现在 all < / em> twoDArray中的地方。
而不是清除数组,你应该做的是创建一个新的实例数组:oneDArray = new ArrayList<String>();
这将创建一个不同的数组作为twoDArray的每个成员