我有一个包含许多Team对象的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);
}
}
答案 0 :(得分:0)
如果有足够的嵌套级别,因此需要递归,那么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);
}
}