Проблема в организации содержимого класса в JAVA - PullRequest
1 голос
/ 09 июня 2010

У меня есть несколько классов, и я пытаюсь заполнить объекты этого класса. Вот что я пробовал. (Вопрос ниже)

public class Team
{
    private String clubName;
    private String preName;
    private ArrayList<String> branches;

    public Team(String clubName, String preName)
    {
        this.clubName = clubName;
        this.preName = preName;
        branches = new ArrayList<String>();
    }

    public Team() {
        // TODO Auto-generated constructor stub
    }

    public String getClubName() { return clubName; }
    public String getPreName() { return preName; }
    public ArrayList<String> getBranches() { return branches; }

    public void setClubName(String clubName) { this.clubName = clubName; }
    public void setPreName(String preName) { this.preName = preName; }
    public void setBranches(ArrayList<String> branches) { this.branches = branches; }
}

public class Branch
{
    private ArrayList<Player> players = new ArrayList<Player>();
    String brName;
    public Branch() {}
    public void setBr(String brName){this.brName = brName;}
    public String getBr(){return brName;}
    public ArrayList<Player> getPlayers() { return players; }
    public void setPlayers(ArrayList<Player> players) { this.players = players; }
}

// ИСПЫТАТЕЛЬНЫЙ КЛАСС

public class test {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

    String a,b,c;
    String q = "q";
    int brCount = 0, tCount = 0;
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
    Team[] teams = new Team[30];
    Branch[] myBranch = new Branch[30];
    for(int z = 0 ; z <30 ;z++)
    {
        teams[z] = new Team();
        myBranch[z] = new Branch();
    }
    ArrayList<String> tmp = new ArrayList<String>();
    int k = 0;
    int secim = Integer.parseInt(input.readLine());
    while(secim != 0)
    {
        if(k!=0)
        secim = Integer.parseInt(input.readLine());
    k++;    
    switch(secim)
    {
    case 1 : 
        brCount = 0;
    a = input.readLine();
    teams[tCount].setClubName(a);
    b= input.readLine();
    teams[tCount].setPreName(b);
    c = input.readLine();

    while(c.equals(q) == false)
    {
        if(brCount != 0)
            {c = input.readLine();}
        if(c.equals(q)== false){
        myBranch[brCount].brName = c;
        tmp.add(myBranch[brCount].brName);
        brCount++;
        }
        System.out.println(brCount);
    }   

    teams[tCount].setBranches(tmp);

    for(int i=0;i<=tCount;i++ ){
    System.out.print("a :" + teams[i].getClubName()+ "   " + teams[i].getPreName()+ "   ");

    System.out.println(teams[i].getBranches());}
    tCount++;
    break;
    case 2: 
        String src = input.readLine();//LATERRRRRRRr

    }

    }
}

}

Проблема - один из элементов моего класса. У меня есть arraylist как элемент класса. Когда я ввожу:

AAA as preName
BBB as clubName
c
d
e   as Branches

Тогда как второй элемент

www as preName
GGG as clubName
a
b as branches 

The result is coming like:
AAA BBB c,d,e,a,b
GGG www c,d,e,a,b

Это означает, что часть класса ArrayList включает и выключает его. Я пытался использовать метод clear (), но вызвал проблемы. Любые идеи.

Ответы [ 2 ]

1 голос
/ 09 июня 2010

Проблема в том, что два объекта Team имеют одну и ту же ссылку на один ArrayList<String>.Есть много способов решить эту проблему, но один способ - позволить Team управлять своим собственным List<Branch>, и он должен выставлять только add(Branch) вместо setBranches(List<Branch>).Это скрыло бы большую часть информации от клиента, предоставляя только самые важные функциональные возможности, и это хорошо.

Обратите внимание, что я использую интерфейс List<Branch> вместо ArrayList<Branch> (или ArrayList<String>).Это соответствует Effective Java 2nd Edition, Item 52: Обратитесь к объектам по их интерфейсам .


. Я также рекомендую использовать java.util.Scanner дляI / O.Посмотрите на API для примеров, и есть много вопросов по stackoverflow, а также об этом.Это сделало бы код намного проще.

0 голосов
/ 09 июня 2010

Вам нужно копировать списки в установщиках, иначе вы везде будете использовать один и тот же список (tmp), поэтому неудивительно, что он имеет одинаковое содержимое:

public void setBranches(List<String> branches) { 
    this.branches = new ArrayList<String>(branches); 
}
public void setPlayers(List<Player> players) { 
    this.players = new ArrayList<Player>(players); 
}

Теоретически, вам также нужно скопировать или обернутьэто в добытчиках, но это другая история.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...