0

这是我在 Stack 上的第一个问题!我在使用 add 方法用数组列表填充二维数组列表时遇到了一个小问题。将我的第一个数组列表添加到二维数组列表并尝试重新填充相同的一维数组列表后,再次将此一维数组列表添加到二维数组列表似乎会改变我添加的二维数组列表的第一个元素......

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,当检查返回 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));
4

2 回答 2

0

是的,如果您没有在循环内创建 oneDArray 并且仅清除它将在每次迭代时被覆盖,这就是元素丢失的原因。这确实是因为您对相同的内部数组列表具有相同的引用。您应该ArrayList<String> innerToBeAdded = new ArrayList<>()在循环条件下创建一个新的数组列表。

于 2013-08-25T23:14:34.993 回答
0

您说“我将 oneDArray 添加到 twoDArray,清空 oneDArray,然后继续此过程,创建列表列表”,但您真正要做的是将同一个数组多次添加到 twoDArray。因为同一个数组被多次添加到 twoDArray 中,所以当你 clear() 时,它会清除所有值,而当你向 oneDArray 中添加一个值时,它会出现在twoDArray 中的所有位置。

而不是清除数组,你应该做的是创建一个新的实例数组: oneDArray = new ArrayList<String>();这将创建一个不同的数组作为 twoDArray 的每个成员

于 2013-08-25T23:27:52.060 回答