Java 如何使用arraylist作为字段有效地深度克隆对象数组

Java 如何使用arraylist作为字段有效地深度克隆对象数组,java,arrays,arraylist,clone,deep-copy,Java,Arrays,Arraylist,Clone,Deep Copy,最深层要素: class Player { //fields contain: int value; } 收集于: class Team { //fields contain: ArrayList<Player> players; } class Splitter { //fields contain: Teams[] teams; } 在拆分器中的函数中我必须克隆团队。我基本上必须克隆每个Team对象来克隆数组teams,每个对

最深层要素:

class Player {
    //fields contain:
    int value;
}
收集于:

class Team {
    //fields contain:
    ArrayList<Player> players;
}
class Splitter {
    //fields contain:
    Teams[] teams;
}
拆分器中的函数中
我必须克隆
团队
。我基本上必须克隆每个
Team
对象来克隆数组
teams
,每个对象都包含一个我必须克隆的数组列表
players
。我不想克隆播放器对象本身

到目前为止,我的解决方案如下所示:

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;
}
private Team[]deepClone(Team[]teams){
团队[]新团队=新团队[团队.长度];
for(int i=0;i

我可以做些什么来提高效率或使其更优雅?

您当前的解决方案相当于这种更简单的形式:

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

您当前的解决方案相当于以下更简单的形式:

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

理想情况下,若你们想做完美的深度克隆,你们也应该克隆玩家。我们应该在每个类中编写克隆方法,然后调用那个克隆方法来获得克隆,不管怎样,你们可以按照下面的方法

class Team {
        //fields contain:
        ArrayList<Player> players;
        public Team clone() {
           Team team = new Team();
           team.players.addAll(players);
           return team;
        }
    }

// ...

    Team[] deepCloneTeams(Team[] teams) {
        Team[] newTeams = new Team[teams.length];
        for (int i = 0; i < teams.length; i++)
            newTeams[i] = teams[i].clone();
        return newTeams;
    }
班级团队{
//字段包含:
ArrayList玩家;
公共团队克隆(){
团队=新团队();
team.players.addAll(玩家);
返回队;
}
}
// ...
团队[]深克隆团队(团队[]团队){
团队[]新团队=新团队[teams.length];
for(int i=0;i
理想情况下,你应该克隆玩家。如果你想做完美的深度克隆,我们应该在每个类中都编写克隆方法,然后调用克隆方法来获得克隆,不管怎样,你都可以按照下面的方法

class Team {
        //fields contain:
        ArrayList<Player> players;
        public Team clone() {
           Team team = new Team();
           team.players.addAll(players);
           return team;
        }
    }

// ...

    Team[] deepCloneTeams(Team[] teams) {
        Team[] newTeams = new Team[teams.length];
        for (int i = 0; i < teams.length; i++)
            newTeams[i] = teams[i].clone();
        return newTeams;
    }
班级团队{
//字段包含:
ArrayList玩家;
公共团队克隆(){
团队=新团队();
team.players.addAll(玩家);
返回队;
}
}
// ...
团队[]深克隆团队(团队[]团队){
团队[]新团队=新团队[teams.length];
for(int i=0;i
老实说,这看起来并不难看!你是县长;-)你有java-8吗?
.getPlayers().addAll(teams[i].getPlayers())
可以为你保存嵌套的
老实说,这看起来并不难看!你是县长;-)你有java-8吗?
.getPlayers().addAll(teams[i].getPlayers())
可以为