【问题标题】:How can I clear one variable (List Of Array Lists), without unintentionally clearing another?如何清除一个变量(数组列表列表),而不会无意清除另一个变量?
【发布时间】:2015-08-10 08:03:29
【问题描述】:

明确地说,我打算使用 一个 3D ArrayList容纳多个 2D ArrayList。

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 的清除中

【问题讨论】:

  • 没有 3D ArrayList 这样的东西。
  • 这就是我在“ArrayList>> main_Functions”上面使用的。除非那叫别的什么?

标签: java android arrays android-activity arraylist


【解决方案1】:
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 列表。

【讨论】:

  • ArrayLists还能继续用吗?
  • @FilmVersion,但蝙蝠侠在上面使用接口List 的回答是正确的做法。
  • @FilmVersion, ArrayListList 接口的实现
  • 我想将 localValues 添加到 main_Functions,而不是使其等于 localValues。我该如何修改上述内容以完成此操作?
  • 我不是让他们平等,它确实localValues添加到main_Functions
【解决方案2】:

你的情况基本上是这样的:(我把ArrayLists去掉了一层,更清楚了)

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 不包含ArrayLists。在 Java 中,如果我们说一个变量持有一个 ArrayList,我们实际上的意思是它持有一个对 ArrayList 的 reference

换句话说,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));

这将为您的“3D ArrayList”添加对全新 ArrayList 的引用,而不是添加对 localValues 所指的相同的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2016-09-11
    • 2021-12-09
    • 2013-02-19
    • 2022-01-05
    • 2018-07-25
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多