2011-11-20 119 views
2

基本上我试图让我的头脑创建一个管理团队和球员的Java程序。团队和玩家对象Java困难

从我的理解我会有一个团队和一个球员类。在团队类中会有get和set方法,以及某些形式的集合来存储玩家的权利,比如数组列表?然后在玩家类中获取和设置相关的方法。

这种设置是因为一个球队拥有一对多球员吗?

我试图让这个工作没有尽头的麻烦。我遇到的一个特殊问题是,每当我创建一个团队对象并向其中添加一个玩家对象时,然后创建另一个团队对象和另一个玩家,但是如果我列出了该新团队的玩家,它将显示前一个玩家添加到第一队以及新球员。

所以我认为这是回到绘图板,并想知道如果有人可以提供一些关于他们将如何构造这个结构的一般建议?

非常感谢,

import java.util.Iterator; 

public class test { 
public test() { 
} 

//Method to show the team and its players 

public static void showTeamPlayers(Team aTeam) { 
    Player players; 
    System.out.println(aTeam.getTeamName()); 
    Iterator e = aTeam.getPlayerList().iterator(); 
    while (e.hasNext()) { 
     players = (Player)e.next(); 
     System.out.println("\t" + players.getPlayerNumber() + " " + players.getPlayerName()); 
    } 
    System.out.println(""); 
} 

public static void main(String[] args) { 
    int teamID; 
    String teamName = ""; 

    //First create a divison/league 
    League DivisionOne = new League("Division One"); 

    //Create a new team object 
    Team team = new Team(teamName); 

    //Asks the user to enter a team name and stores the input 
    UserInput.print("Enter team name:"); 
    teamName = UserInput.readString(); 

    team.setTeamName(teamName); 

    //Add the team 
    DivisionOne.addTeam(new Team(teamName)); 

    Player player = new Player(0, "Dave"); 
    Player player1 = new Player(1, "Dennis"); 
    Player player2 = new Player(2, "Peter"); 

    //Add to team 
    team.addPlayer(player); 
    team.addPlayer(player1); 
    team.addPlayer(player2); 

    test.showTeamPlayers(team); 

    //Asks the user to enter a team name and stores the input 
    UserInput.print("Enter team name:"); 
    teamName = UserInput.readString(); 

    team.setTeamName(teamName); 

    //Add the team 
    DivisionOne.addTeam(new Team(teamName)); 

    Player player3 = new Player(3, "Creamer"); 
    Player player4 = new Player(4, "Matt"); 
    Player player5 = new Player(5, "John"); 

    //Add to team 1 
    team.addPlayer(player3); 
    team.addPlayer(player4); 
    team.addPlayer(player5); 

    test.showTeamPlayers(team); 
} 
} 
+4

你应该发布一些说明你的问题的代码。 – Dave

+1

如果您发布您的代码,这将有所帮助,这样我们就可以看到发生了什么问题。 –

回答

2

你的结构应该是完全正确的这种方式(和顺便说一句,“一个到许多关联“用”1:n“或”1:(1..n)“来描述)。

要么你确定在你的代码的某个地方有一个bug(例如一个静态字段或者使用了一个标识符两次),或者你可能会遇到一个ArrayList的问题(尝试使用LinkedList进行测试) ,但我不确定。

编辑: 你忘了发表您的模型中,我们只看到了它的测试,但你已经得到了一些错误:

Team team = new Team(teamName); 
teamName = UserInput.readString(); 
team.setTeamName(teamName); 

到目前为止,一切都很好。除了它的毫无意义的,与空teamName创建团队的一个实例,然后再把复位,但NVM ....

DivisionOne.addTeam(new Team(teamName)); 

Babam,你不加入以上DivisionOne,您所创建的团队情况下,不你正在创建一个新的。其实,这是错误编号1

team.addPlayer(player); 
team.addPlayer(player1); 
team.addPlayer(player2); 

但是你把新的球员,你在上面创建的实例,如果你想使他们没有得到其是对于DivisionOne创建团队....错误.. 2号。而随后

team.setTeamName(teamName); 
DivisionOne.addTeam(new Team(teamName)); 
. 
. 
. 
team.addPlayer(player3); 
team.addPlayer(player4); 
team.addPlayer(player5); 

再次,你只设置你的团队的第一个实例的新teamName,然后your're创造DivisionOne一个新的团队。到目前为止,Bug No.3;) 但是,您正在将一些新玩家添加到“旧”团队实例中,与上面相同。

总而言之,您创建的“团队”实例与您的DivisionOne无关。所以,你创建了一个Team的实例,把所有六个参与者放在一起,并且你调用了两次showTeamPlayers。毫不奇怪毕竟,前3级的玩家依然在那里....

最后一点:

League DivisionOne = new League("Division One"); 

应该

League divisionOne = new League("Division One"); 

自变量从未与一个大写字母开始,“DivisionOne”也可以是一个静态类(因为班级总是以人均字母开头......)

+0

谢谢你,只是想知道,例如我怎么能过来这些错误?如果您可以尝试解释第一个bug,那么我可以向您提供建议并尝试解决其他错误。其实有人殴打你,无论如何,谢谢! – mjsey

0

我没有试图得到这个工作,后患无穷。我遇到的一个特殊的 问题是,我每次创建一个团队对象 并添加一个玩家对象,然后创建另一个团队对象和 另一个球员,但如果我列出该新球队的球员它显示 以前的球员加入第一队以及新球员。

确保团队对象不共享任何字段。也许你正在使用一个“静态”字段来存放玩家名单?如果你声明一个静态字段,它将在所有团队实例中共享,这可能不是你想要的。

0

看到你的代码将是有益的,但鉴于你的描述,我想像像这样的东西作为一个例子开始:

// Team.java 
public class Team { 
    private String name; 
    private List<Player> players; 

    public Team(String name) { 
     this.name = name; 
     this.players = new ArrayList<Player>(); 
    } 

    public String getName() { 
     return name; 
    } 

    public List<Player> getPlayers() { 
     return players; 
    } 
} 

// Player.java 
public class Player { 
    private String name; 

    public Player(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

// Main.java 
public class Main { 
    public static void main(String[] args) { 
     Team team1 = new Team("Team #1"); 
     Team team2 = new Team("Team #2"); 
     team1.getPlayers().add(new Player("Bob")); 
     team2.getPlayers().add(new Player("Joe")); 
    } 
} 
0

我同意@ Kaleb的回答,但我会给你一个替代方案(如果你想)......

public class Player { 
    private String name; 
    protected int speed; 
    protected int health; 

    public Player(String name, int speed, int health) { 
     this.name = name; 
     this.speed = speed; 
     this.health = health; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Map<Player> team1 = new HashMap<Player>(); 
     Map<Player> team2 = new HashMap<Player>(); 
     System.out.print("Enter the name of the player followed by its speed, health, and team number:"); 
     java.util.Scanner sc = new java.util.Scanner(System.in).useDelimiter(","); 
     String name = sc.next(); 
     int speed = sc.nextInt(); 
     int health = sc.nextInt(); 
     if (sc.nextInt() == 1) { 
      team1.put(new Player(name, speed, health)); 
     } else { 
      team2.put(new Player(name, speed, health)); 
     } 
    } 
} 
2

好的错误已经被PaddyG提及。这里是溶液:

替换此代码:

teamName = UserInput.readString(); 

team.setTeamName(teamName); 


//Add the team 
DivisionOne.addTeam(new Team(teamName)); 

有:

teamName = UserInput.readString(); 

team = new Team(teamName); 

//Add the team 
DivisionOne.addTeam(team); 

而且还取代:

teamName = UserInput.readString(); 

team.setTeamName(teamName); 

//Add the team 
DivisionOne.addTeam(new Team(teamName)); 


Player player3 = new Player(3, "Creamer"); 
Player player4 = new Player(4, "Matt"); 
Player player5 = new Player(5, "John"); 

有:

teamName = UserInput.readString(); 

team = new Team(teamName); 

//Add the team 
DivisionOne.addTeam(team); 


Player player3 = new Player(3, "Creamer"); 
Player player4 = new Player(4, "Matt"); 
Player player5 = new Player(5, "John"); 

正如您在上面的代码中看到的那样,我们使用新团队的新实例更新了team变量。这个新实例被添加到DivisionOne。当您在做DivisionOne.addTeam(new Team(teamName));时,您正在创建并添加一个全新实例到 DivisionOne,但您要添加的玩家的实例是不同的(由team变量保存)。因此,soln将创建一个新实例并使用这个新创建的实例设置变量team,然后向其添加播放器并将其添加到DivisionOne

+0

感谢那 – mjsey

+0

你还需要创建一个新的团队实例来移除已经存在的团队? – mjsey

+0

没有。但必须有办法通过使用团队名称找到团队,然后在ArrayList中搜索它。假设您的DivisionOne正在将团队存储在HashMap 中,其中关键字String是团队名称,值是团队。然后你可以通过说'teamMap.remove(teamName)'来轻松删除它。 – havexz