0

我将这些说明用于该方法:构造函数 public ProgrammingTeam(ProgrammingTeam p),它将 ProgrammingTeam p 作为参数并构造 p 的深层副本。不要只写 meet = p.meets;。要进行深拷贝,必须调用 ArrayList 的拷贝构造函数: meet = new ArrayList();。

  public ProgrammingTeam( ProgrammingTeam p ) {
    teamName = p.teamName;
    teamMembers = new String [ p.teamMembers.length ];
    for (int i = p.teamMembers.length - 1; i >= 0; i--) {

    }
    meets = new ArrayList < Competition >();
}

我无法弄清楚我应该如何撰写然后完成深层副本。我知道它需要一个 for 循环来实际复制每个对象,但我不知所措,谢谢!

4

3 回答 3

2

关于字符串数组...

字符串是不可变的,因此只需复制数组就足够了,例如使用Arrays.copyOf()实用方法:

teamMembers = Arrays.copyOf( p.teamMembers, p.teamMembers.length );

至于名单,这取决于...

如果Competitionimmutable,请使用 ArrayList 的复制构造函数:

meets = new ArrayList<Competition>(p.meets);

如果Competition是可变的,则需要调用它的复制构造函数(如果需要,定义它)。

meets = new ArrayList<Competition>();
for (Competition c : p.meets) {
    meets.add(new Competition(c));
}
于 2013-04-12T03:04:42.943 回答
0

您需要创建所有 ProgrammingTeam 参数 p 属性的深层副本。

您可以执行以下操作:

for(int i = 0; i < p.teamMembers.length -1; i++){
        TeamMember teamMember = new TeamMember();
        // set attributes
        teamMember.setAttribute1(p.teamMembers[i].getAttribute1());
        ...
        teamMember.setAttributeN(p.teamMembers[i].getAttributeN());
         this.teamMembers[i] = teamMember;
 }

当然,您可以简单地为列表中需要深度复制的任何对象创建一个复制构造函数。复制构造函数本质上需要完成我在 for 循环中描述的相同类型的事情。

于 2013-04-12T02:57:25.367 回答
0

做一个深拷贝String[] teamMembers使用java.util.Arrays.copyOf(teamMembers, teamMembers.length)

至于List<Competition> meets您可以使用的深层副本,new ArrayList<Competition>(meets)但只有在竞争不可变的情况下才会好

于 2013-04-12T02:58:52.773 回答