эта программа печатает все названия команд, а не только нарушители правил - PullRequest
0 голосов
/ 06 марта 2020

следующая программа сначала берет два целых числа, количество легальных футболистов (n) и количество команд (m). в следующих n строках он берет имена легальных игроков и помещает их в качестве ключа хеш-карты со всеми их значениями строки ноль. затем он берет названия команд и игроков, которых они выбрали. если команда выбирает игрока, имя которого не входит в число легальных игроков, команда нарушила закон и его имя будет напечатано как виновное, или если команда выберет игрока, который уже занят другой командой, обе имена команд будет напечатан. затем я помещаю их в набор деревьев, потому что хочу, чтобы имена печатались в алфавитном порядке c. но когда я запускаю программу, печатаются все названия команд, в чем проблема?

    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

1 Ответ

0 голосов
/ 06 марта 2020

На самом деле я бы заподозрил следующие условия: -1 oop:

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

и

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

Используйте < вместо <=. Я подозреваю, что теперь вы читаете еще одно имя в каждой команде, чем требуется.

Кроме того, после того, как вы прочитали целочисленное значение, курсор все еще находится на той же строке, прямо перед "\ n", поэтому следующий вызов scanner.nextLine () возвращает не строку следующей строки, а пустую строку. Из-за этого у вас появился дополнительный игрок с пустым именем, который вы также пытались ввести в каждую команду, поэтому каждая команда была отмечена как виновная. Вы можете прочитать больше об этом здесь . Чтобы решить эту проблему, вы можете, например, поместить дополнительный 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);
  }
}
...