gpt4 book ai didi

java - 如何按值复制(深度复制)类型为 List> 的对象?

转载 作者:行者123 更新时间:2023-11-30 05:25:35 25 4
gpt4 key购买 nike

我尝试了很多方法来复制一个对象而不引用它,在我看来,所有这些方法都是浅复制而不是深复制。

假设我发送了一个 java List<List<Integer>> 类型的对象使用从 main 到方法的参数。

void reverseMatrix(List<List<Integer> > grid)
{

}

所以我定义了List> tempGrid= new ArrayList<>();在上面的方法中,我想复制所有值(按值而不是按引用。)

我尝试了迭代器,如下所示:

Iterator<List<Integer>> iterator = grid.iterator();
while(iterator.hasNext()){
tempGrid.add(iterator.next());
}

应用上面的代码后,仍然更改父对象(网格)而不是 tempGrid。

如果我应用此代码 java tempGrid.get(0).set(0,1);它也会改变网格。

我看到一些关于按值迭代的主题。

        List<Integer> temp1 = new ArrayList<>();

for(List<Integer> list: grid){
for(Integer numb: list) {
temp1.add(numb);
}
tempGrid.add(temp1);
}

我尝试使用 Collections.copy,但给我错误,des 大小不适合源。

我希望得到一个新对象,而不会受到对旧对象的操作的影响。

最佳答案

Integer对象是不可变的,因此您不需要深度复制它们。

外部列表和内部列表都是可变的,因此需要复制它们。假设我们不需要保留列表类型,例如ArrayListLinkedList ,我们可以简单地使用ArrayList(Collection)构造函数来复制内部列表。

使用不需要 Java 8 的代码:

static void deepCopy(List<List<Integer>> input) {
List<List<Integer>> output = new ArrayList<>(input.size());
for (List<Integer> inner : input)
output.add(new ArrayList<>(inner));
return output;
}

关于java - 如何按值复制(深度复制)类型为 List<List<Integer>> 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58698146/

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