2017-02-22 14 views
2

フットボールチームオブジェクトを構築するクラスを作成しようとしていますが、配列が実際にフィールドとしてどのように機能するかはよく分かりません。私のコンストラクタは次のようになります。フィールドの1つが配列(Java)であるクラス内でコンストラクタを作成する方法

public class FootballTeam { 
private String[] players; 
private String colour; 
private int goalDifference; 
private Boolean challengeTrophy; 

//---------- Construction and Initialisation of the FootballTeam object---------- // 
public FootballTeam(String[] aPlayer, String aColour, int aGoalDifference, Boolean inChallengeTrophy) { 
    for (int i = 0; i < 5; i++) {players[i] = aPlayer[i]} 
    colour = aColour; 
    goalDifference = aGoalDifference; 
    challengeTrophy = inChallengeTrophy; 
} 

私は本当に私は選手たちの一部をテストするために、文字列の配列を使用することができるようにコンストラクタを書くことについて移動する方法についてはよく分かりません。

新しいプレーヤーを追加または削除できるメソッドを作成する必要があります。どのように構造化すればよいか分かりません。乾杯!

+2

なぜ単に 'players = aPlayer'にならないのですか?どちらもString型の配列なので、forループなしで代入できるだけです。 – mammago

答えて

0

はい、正しく実行しました。しかし、両方の配列を同じようにするためにforループを使う代わりに、 "players = aPlayer;"を置くことができます。

3

あなたができるだけ:

this.players = aPlayer; 

あなたは(あなたがforループでやっているような)配列の内容をコピーしたい場合は、まず選手を初期化する必要があります。ここで

this.players = new String[numberOfFields]; 
+1

** note **この場合、 'this'はオプションです。 –

0

コードは次のとおりです。

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class FootballTeam { 
    private Set<String> players; 
    private String colour; 
    private int goalDifference; 
    private Boolean challengeTrophy; 

    public FootballTeam(String[] aPlayer, String aColour, int aGoalDifference, Boolean inChallengeTrophy) { 
     players = new HashSet<>(Arrays.asList(aPlayer)); 
     colour = aColour; 
     goalDifference = aGoalDifference; 
     challengeTrophy = inChallengeTrophy; 
    } 

    public void addPlayer(String player) { 
     players.add(player); 
    } 

    public void removePlayer(String player) { 
     players.remove(player); 
    } 
} 
0

それが怖いのと同じ参照がオブジェクトごとに繰り返されているため、直接割り当てを避け、このラインで

this.players = Arrays.copyOfRange(aPlayer,0,5) 

をループ部分の全体を交換してください。 copyofrangeに加えて、あなたが望む番号に応じて最初の5人のプレーヤーなどを追加することができます。

1

私は本当にあなたの文字列配列をどうしようとしているものを理解していないが、あなたは本当にあなたがこのようなあなたの配列を初期化するために持っていることを行いたい場合:

public FootballTeam(String[] aPlayer, String aColour, int aGoalDifference, Boolean inChallengeTrophy) { 
    players = new String[5]; 
    for (int i = 0; i < 5; i++) { 
     players[i] = aPlayer[i]; 
    } 
    colour = aColour; 
    goalDifference = aGoalDifference; 
    challengeTrophy = inChallengeTrophy; 
} 

しかし、あなたはあなたを保存したい場合あなたが選手の一個の要素を変更した場合、それはまたaPlayerを変更しますので、あなただけの代わりに、配列の各要素のディープコピーの参照をコピーするため

public FootballTeam(String[] aPlayer, String aColour, int aGoalDifference, Boolean inChallengeTrophy) { 
    players = aPlayer; 
    colour = aColour; 
    goalDifference = aGoalDifference; 
    challengeTrophy = inChallengeTrophy; 
} 

はこれに注意してください:あなただけのことができ、あなたのオブジェクトでaPlayer。

0

単純な割り当てthis.players = aPlayerを実行しないでください。aPlayerのコンテンツが変更された場合、プレイヤーの配列も更新されるためです。

コピーを行うにはループを実行できますが、System.arraycopyまたはArrays.copyOfを使用する方がよい場合があります。

0

次のコードをコンストラクタで試してみてください。あなたはinitialize全体array値をことができるよりもここで

サンプルコード

public FootballTeam(String[] aPlayer, String aColour, int aGoalDifference, Boolean inChallengeTrophy) { 
    players = new String[aPlayer.length]; 
    players = aPlayer; 
    colour = aColour; 
    goalDifference = aGoalDifference; 
    challengeTrophy = inChallengeTrophy; 
} 

は、最初のあなたはarrayinitializeサイズにする必要があります。

あなたのお役に立てれば幸いです。

関連する問題