如何清除一个变量(列表列表),而不是无意中清除另一个?

时间:2015-05-28 01:56:29

标签: java android arrays android-activity arraylist

要说清楚,我打算使用一个3D ArrayList 来容纳多个2D ArrayLists。

3D ArrayList(当我说3D ArrayList时,这就是我所说的):

ArrayList<ArrayList<ArrayList<String>>> main_Functions = new ArrayList<>();

2D ArrayList(当我说2D ArrayList时,这就是我所说的):

ArrayList<ArrayList<String>> localValues = new ArrayList<>();

但是在添加每个2D ArrayList之后,我打算清除包含原始2D ArrayList的变量。所以旧信息不会干扰新添加的信息等。但是在我清除了保存原始2D ArrayList的变量(添加到3D ArrayList中的内容)后,添加到3D ArrayList的数据将被删除。

我的代码如下:

ArrayList<ArrayList<String>> localValues = new ArrayList<>();
ArrayList<ArrayList<ArrayList<String>>> main_Functions = new ArrayList<>();

           if (arrayListNotEmpty(localValues)) {
                main_Functions.add(localValues);
                localValues.clear();
          }

我该如何解决这个问题? 所以添加到3D ArrayList的信息仍保留在2D ArrayList的清除上?

2 个答案:

答案 0 :(得分:4)

你的情况基本上是这样的:(我删除了一级ArrayList以使其更清晰)

ArrayList<String> inner = new ArrayList<>();
ArrayList<ArrayList<String>> outer = new ArrayList<>();

inner.add("Hello World!");
outer.add(inner);
System.out.println(outer.get(0)); // prints [Hello World!]
inner.clear();
System.out.println(outer.get(0)); // prints [] i.e. an empty list

或者,甚至更简单:

ArrayList<String> a = new ArrayList<>();
a.add("Hello World!");

ArrayList<String> b = a;

System.out.println(b); // prints [Hello World!]
a.clear();
System.out.println(b); // prints []

这是因为ab不包含ArrayList。在Java中,如果我们说变量包含一个ArrayList,我们实际上意味着它将引用保存到ArrayList。

换句话说,a实际包含的是“ArrayList#1234”或类似的东西。 b还包含“ArrayList#1234”。行a.clear()清除ArrayList#1234,行System.out.println(b);打印ArrayList#1234(我们刚刚清除)的内容。

相反,您可以随时创建一个新的ArrayList。

例如,而不是

main_Functions.add(localValues);
你可以做点什么

ArrayList<ArrayList<String>> localValues_copy = new ArrayList<>(localValues);
main_Functions.add(localValues_copy);

或缩短:

main_Functions.add(new ArrayList<>(localValues));

这会将对全新ArrayList的引用添加到“3D ArrayList”,而不是添加对localValues引用的同一个引用。

答案 1 :(得分:0)

List<List<String>> localValues = new ArrayList<>();
List<List<String>> localValuesCopy = new ArrayList<>(localValues);

localValues.clear();// won't affect main_Functions

List<List<List<String>>> main_Functions = new ArrayList<>();
main_Functions.add(localValuesCopy);

通过创建localValues列表的副本,数据会被复制并清除它不会影响这些新数据。

虽然我不明白为什么要清除localValues列表,但清除localValues无法更改main_Functions列表。