gpt4 book ai didi

java - 创建一个 ArrayList 的 ArrayList,与另一个 ArrayList 的 ArrayList 相比,该 ArrayList 具有一个附加元素

转载 作者:行者123 更新时间:2023-12-02 03:29:15 28 4
gpt4 key购买 nike

我有一个 ArrayList (alal) 和一个 ArrayList(al) 的 ArrayList。我想将 al 插入 alal,但我希望 alal.get(0) 包含 al 拥有的所有内容以及添加的元素 100。我认为最简单的方法是首先执行

alal.add(al);

然后访问它的第 0 个元素,并添加 100,例如

alal.get(0).add(100);

然而,这样做的问题是 al 的内容也会改变,因为它是一个对象,所以 alal 保存的是它的引用而不是值。

我已经尝试过以下。请告诉我这是否是正确的方法,或提出改进建议。

import java.util.ArrayList;

public class additionalal {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);al.add(2);al.add(3);

//WRONG
// alal.add(al);
// alal.get(0).add(100);

//CORRECT
ArrayList<Integer> alextra = new ArrayList<Integer>();
alextra.addAll(al);
alextra.add(100);
alal.add(alextra);

System.out.println(alal);
System.out.println(al);
}
}

最佳答案

添加时将列表包装到新的 ArrayList 中,从而克隆它:

alal.add(new ArrayList<>(al));
alal.get(0).add(100);

但请注意,列表的元素不会随之克隆。当您有整数列表时这是可以的,但在存储具有动态属性的类型元素时可能会导致意外行为。例如,假设您想要存储 PersonListList:

class Person {
String name = "";

public String getName() {
return this.name;
}

public void setName(String otherName) {
this.name = otherName;
}

public String toString() {
return "Person[name=" + this.name + ']';
}
}

现在,我创建一个 Person,将其放入 List persons 中,然后放入 persons 的副本例如,personGroups 中的 code>:

Person user = new Person();
user.setName("saltandwater");

List<Person> persons = new ArrayList<>();
persons.add(user);

List<List<Person>> personGroups = new ArrayList<>();
personGroups.add(new ArrayList<>(persons));

打印两个列表将导致类似的结果

persons: [Person[name=saltandwater]]
personGroups: [[Person[name=saltandwater]]]

现在,将新的 Person 添加到 persons 中不会修改 personGroups。但是,由于 user 未克隆(仅克隆了 persons 列表),因此 user.name 中的更改将反射(reflect)在两个列表中:

user.setName("Mr. Yetti");

将导致

persons: [Person[name=Mr. Yetti]]
personGroups: [[Person[name=Mr. Yetti]]]

关于java - 创建一个 ArrayList 的 ArrayList,与另一个 ArrayList 的 ArrayList 相比,该 ArrayList 具有一个附加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com