0

メソッドに次の命令を使用しています。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 に答える