该程序打印所有团队的名称,而不仅仅是违反规则的人

this program prints all the teams names instead of only the rule breakers

下面的程序首先取两个整数,合法足球运动员的数量(n)和球队的数量(m)。在接下来的 n 行中,它获取合法玩家的名字并将它们作为哈希图的键,它们的所有值都为零。然后它采用球队的名字和他们选择的球员。如果一支球队选择了一名名字不在合法球员中的球员,则该球队违反了法律并且他的名字将被打印为有罪,或者如果一支球队选择了一名已经被另一支球队选中的球员,则双方球队的名字将被打印。 然后我将其放入树集中,因为我希望名称按字母顺序打印。 但是当我 运行 程序时,所有团队的名字都被打印出问题在哪里?

    import java.util.HashMap;
    import java.util.Scanner;
    import java.util.TreeSet;

    public class Tamrin1_2_1 {
        public static void main(String[] args) {
            String player,team;
            int numberOfTeams,numberOfPlayers;
            Scanner scanner=new Scanner(System.in);
            HashMap<String,String> teamsAndPlayers=new HashMap<String,String>();
            TreeSet<String> guilty=new TreeSet<String>();
            numberOfPlayers=scanner.nextInt();
            numberOfTeams=scanner.nextInt();
            for(int i=0;i<=numberOfPlayers;i++) {
                teamsAndPlayers.put(scanner.nextLine(), "0");
            }
            for(int i=0;i<numberOfTeams;i++) {
                team=scanner.nextLine();
                numberOfPlayers=scanner.nextInt();
                for(int j=0;j<=numberOfPlayers;j++) {
                    player=scanner.nextLine();
                    if(teamsAndPlayers.containsKey(player)) {
                        if(teamsAndPlayers.get(player).equals("0")) {
                            teamsAndPlayers.put(player, team);
                        }
                        else {
                            guilty.add(team);
                            guilty.add(teamsAndPlayers.get(player));
                         }
                    }
                    else {
                        guilty.add(team);
                    }
                }
            }
            System.out.println(guilty);

            }
        }

这是示例输入:

    10 4
    dani carvajal
    eder militao
    sergio ramos
    raphael varane
    nacho
    eden hazard
    toni kroos
    martin odegaard
    karim benzema
    luka modric
    real madrid
    3
    martin odegaard
    karim benzema
    sergio ramos
    valencia
    2
    dani carvajal
    luka modric
    real sociedad
    2
    martin odegaard
    nacho
    atletico madrid
    3
    raphael varane
    eden hazard
    toni kroos

我想要的输出是:

    real madrid
    real sociedad

但我得到的输出是:

    atletico madrid
    real madrid
    real sociedad
    valencia

实际上我会怀疑这些 for 循环条件:

for(int i=0;i<=numberOfPlayers;i++) {

for(int j=0;j<=numberOfPlayers;j++) {

使用 < 而不是 <=。我怀疑现在您正在为每个团队多读一个名字。

此外,在您读取一个整数值后,光标仍在同一行,就在“\n”的前面,因此下一个 scanner.nextLine() 调用不会 return下一行的字符串,但是一个空字符串。因此,你得到了一个空名的额外球员,你也试图将其放入每支球队,因此每支球队都被标记为有罪。您可以阅读更多相关信息 here。例如,为了解决这个问题,您可以在读取一个整数并接下来要读取一个字符串后放置一个额外的 scanner.nextLine():

public class Tamrin1_2_1 {
  public static void main(String[] args) {
    String player,team;
    int numberOfTeams,numberOfPlayers;
    Scanner scanner=new Scanner(System.in);
    HashMap<String,String> teamsAndPlayers=new HashMap<String,String>();
    TreeSet<String> guilty=new TreeSet<String>();
    numberOfPlayers=scanner.nextInt();
    numberOfTeams=scanner.nextInt();
    scanner.nextLine();
    for(int i=0;i<numberOfPlayers;i++) {
      teamsAndPlayers.put(scanner.nextLine(), "0");
    }
    for(int i=0;i<numberOfTeams;i++) {
      team=scanner.nextLine();
      numberOfPlayers=scanner.nextInt();
      scanner.nextLine();
      for(int j=0;j<numberOfPlayers;j++) {
        player=scanner.nextLine();
        if(teamsAndPlayers.containsKey(player)) {
          if(teamsAndPlayers.get(player).equals("0")) {
            teamsAndPlayers.put(player, team);
          }
          else {
            guilty.add(team);
            guilty.add(teamsAndPlayers.get(player));
          }
        }
        else {
          guilty.add(team);
        }
      }
    }
    System.out.println(guilty);
  }
}