javaarraysarraylistclonedeep-copy

how to efficiently deep clone an array of objects with an arraylist as a field


deepest element:

class Player {
    //fields contain:
    int value;
}

collected in:

class Team {
    //fields contain:
    ArrayList<Player> players;
}

collected in:

class Splitter {
    //fields contain:
    Teams[] teams;
}

In a function in Splitter I have to clone teams. I basically have to clone the array teams by cloning each Team object, which each contains an ArrayList players I have to clone. I do not want to clone the Player objects themselves.

My solution thus far looks something like this:

private Team[] deepClone(Team[] teams) {
    Team[] new_teams = new Team[teams.length];
    for (int i = 0; i < teams.length; i++) {
        new_teams[i] = new Team();
        for (Player player : teams[i].getPlayers())
            new_teams[i].getPlayers().add(player);
    }
    return new_teams;
}

anything I could change to make this more efficient or elegant?


Solution

  • Your current solution is equivalent to this simpler form:

    private Team[] deepClone(Team[] teams) {
        Team[] new_teams = new Team[teams.length];
        for (int i = 0; i < teams.length; i++) {
            new_teams[i] = new Team();
            new_teams[i].getPlayers().addAll(teams[i].getPlayers());
        }
        return new_teams;
    }
    

    You can make this more elegant without the loop indexes using streams and lambdas:

    private Team[] deepClone(Team[] teams) {
        return Stream.of(teams).map(team -> {
            Team newTeam = new Team();
            return newTeam.getPlayers().addAll(team.getPlayers());
        }).toArray(Team[]::new);
    }