【问题标题】:Team and players objects Java difficulties球队和球员反对 Java 困难
【发布时间】:2012-02-18 18:14:49
【问题描述】:

基本上,我正在努力创建一个管理团队和球员的 Java 程序。

据我了解,我将拥有一个团队和一个球员课程。在 team 类中会有 get 和 set 方法,以及某种形式的集合来存储球员,比如数组列表?然后在播放器类中相关的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);
}
}

【问题讨论】:

  • 你应该发布一些代码来说明你的问题。
  • 如果您发布代码会有所帮助,以便我们查看问题所在。

标签: java object


【解决方案1】:

您的结构应该完全正确(顺便说一句,“一对多关联”用“1:n”或“1:(1..n)”来描述)。

您的代码中的某处肯定有错误(发布它;)),例如静态字段或两次使用标识符,或者您可能会在此处遇到 ArrayList 问题(尝试使用 LinkedList 进行测试),但我不确定。

编辑: 你忘了发布你的模型,我们只看到了它的测试,但是你已经发现了一些错误:

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

到目前为止,一切都很好。除了它没有意义,用空的teamName创建一个Team实例然后重置它,但是nvm....

DivisionOne.addTeam(new Team(teamName));

Babam,您没有将上面创建的 Team 实例添加到 DivisionOne,您正在创建一个新实例。其实就是Bug No.1

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

但是您将新玩家放入您在上面创建的实例中,他们没有进入为 DivisionOne 创建的团队......如果你愿意的话,Bug No.2......然后

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

同样,您只是为您的第一个 Team 实例设置了一个新的 teamName,然后您正在为 DivisionOne 创建一个新的 Team。到目前为止,Bug No.3 ;) 但是您将一些新玩家放入“旧”团队实例中,与上述相同。

总而言之,您创建的“团队”实例与您的 DivisionOne 无关。因此,您创建了一个 Team 实例,将所有六个玩家放在一起,并在其上调用了 2 次 showTeamPlayers。毕竟前三名选手还在里面也就不足为奇了....

最后一点:

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

应该是

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

由于变量从不以大写字母开头,“DivisionOne”也可以是静态类(因为类总是以大写字母开头...)

【讨论】:

  • 谢谢你,只是想知道例如我怎样才能克服这些错误?如果您可以尝试解释第一个错误,那么我可以为您提供建议并尝试解决其他错误。实际上有人已经打败了你,无论如何谢谢!
【解决方案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 变量保存)。所以解决方法是创建一个新实例,并用这个新创建的实例设置变量team,然后将玩家添加到它并添加到DivisionOne

【讨论】:

  • 您是否还必须创建一个新的团队实例才能删除已经存在的团队?
  • 不。但是必须有一种方法来定位团队,方法是使用团队名称,然后在 ArrayList 中搜索它。假设您的 DivisionOne 将 Team 存储在 HashMap 中,其中键 String 是团队名称,值是团队。然后你可以通过说teamMap.remove(teamName)轻松删除它。
  • 我还将团队存储在一个数组列表中。
  • 如果您存储在 ArrayList 中,那么您必须遍历它并比较列表中每个团队的名称,当您找到它时将其删除。就像Team teamToDelete; for(Team team : teams) if(team.getName().equals(teamName)) { teamToDelete = team; break; } teams.remove(teamToDelete); 在这段代码中,我们试图首先在 ArrayList 中找到要删除的 teamName 实例,然后我们调用 ArrayList 上的 api 来实际删除它。
  • 假设我要让用户输入一个字符来列出一个团队的球员,我每次都需要创建一个新的团队实例吗?因为就目前而言,我可以添加一支球队和球员,并列出他们。但是,如果我创建另一个团队并尝试列出第一个创建的团队,它们会显示为空白,即使那里有玩家!
【解决方案3】:

我在尝试让它工作时遇到了无穷无尽的麻烦。一个特别的 我遇到的问题是每次创建团队对象时, 并为其添加一个玩家对象,然后创建另一个团队对象并 另一名球员,但如果我列出该新球队的球员,它会显示 前一名球员和新球员一样加入了第一支球队。

确保团队对象不共享任何字段。也许您在包含球员的列表中使用“静态”字段?如果您声明一个字段为静态,它将在所有团队实例之间共享,这可能不是您想要的。

【讨论】:

    【解决方案4】:

    查看您的代码会有所帮助,但鉴于您的描述,我想以这样的示例开始:

    // 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"));
       }
    }
    

    【讨论】:

      【解决方案5】:

      我同意@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));
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多