gpt4 book ai didi

java - 如何复制嵌套列表而不导致 StackOverflowError

转载 作者:行者123 更新时间:2023-12-02 05:40:47 25 4
gpt4 key购买 nike

我有一个 ArrayList,其中包含许多团队对象。我需要创建此 arraylist 的深层克隆,但每个 Team 对象都有一个包含更多 Team 对象的 ArrayList。当母 ArrayList 的大小达到数百时,我收到 StackOverflow 错误。

我编写了一个实用程序函数,通过在每个元素上调用 Team::clone() 来深度克隆数组列表。 Team::clone() 被重写以返回 Team 对象的深拷贝。 Team::clone() 包含对实用程序 deepclone 函数的调用,以克隆其自己的数组列表

如果您需要代码

class Team {
int foo;
ArrayList<Team> teams;


public Team(int foo, ArrayList<Team> bar){
teams=bar;
foo=foo;
}

@Override
public Team clone(){
new Team(foo,deepclone(teams));
}


public static ArrayList<Team> deepclone(ArrayList<Team> in){
ArrayList<Team> ret=new ArrayList<>();

for(Team t:in) {
ret.add(t.clone());
}

return ret;
}

public static void main (String args[]){
//already have a huge ArrayList of teams
deepclone(thebigarraylist);
}
}

最佳答案

如果有足够的嵌套级别,从而导致递归,StackOverflowError 是不可避免的。您可以尝试的一件事是将deepclone内联到近一半的递归级别数,使允许的嵌套级别数加倍。您还可以使 Team 实现 Cloneable 并使 deepclone 通用(重命名为 deepCloneIterable)。 (注意:未经测试!)

class Team implements Cloneable {
int foo;
ArrayList<Team> teams;


public Team(int foo, ArrayList<Team> bar){
teams = bar;
foo = foo;
}

@Override
public Team clone(){
ArrayList<Team> teamsCopy = new ArrayList<>();

for(Team team : teams) {
teamsCopy.add(team.clone());
}

return new Team(foo, teamsCopy);
}

public static ArrayList<T> deepCloneIterable(Iterable<T> in){
ArrayList<T> out = new ArrayList<>();

for(T t : in) {
out.add(t.clone());
}

return out;
}

public static void main(String args[]){
//already have a huge ArrayList of teams
deepCloneIterable(thebigarraylist);
}
}

关于java - 如何复制嵌套列表而不导致 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140495/

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