如何在不引起StackOverflowError的情况下复制嵌套列表

时间:2019-05-15 01:01:17

标签: java arrays clone

我有一个包含许多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);
    }
}

1 个答案:

答案 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);
    }
}