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?
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);
}