java - 该程序打印所有团队的名称,而不仅仅是破坏规则的人

标签 java hashmap treeset

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

    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() 调用不会返回下一行的字符串,而是返回一个空字符串。因此,你有一个额外的空名球员,你也试图将其放入每个团队中,因此每个团队都被标记为有罪。您可以阅读更多相关信息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);
  }
}

关于java - 该程序打印所有团队的名称,而不仅仅是破坏规则的人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60560783/

相关文章:

java - 如何修复在 TreeSet 中使用的比较器

Java:没有包访问的子类访问

java - 如何与mysql中其他行插入的数据形成代码字符串

java - 通过WebView.goBack执行url

java - 多次引用另一个类中的 HashMap 是否效率低下?

java - textArea.setText() 错误输出

java - 在设定的时间段后从缓存中删除项目?

scala - 为什么 Scala 的 TreeSet 返回 SortedSet

java - 如何获取 GridLayout 中元素的 X 和 Y 索引?

java - SortedSet::removeAll( headSet ) 失败,但从 headSet 派生另一个集合成功。为什么?