Как использовать сканер hasNext () для циклического прохождения строки текста на клавиатуре и проверки правильности ввода пользователем интергера и строки - PullRequest
0 голосов
/ 03 ноября 2019

У меня возникла проблема, пытаясь понять, как я могу пройти через строку ввода с клавиатуры, которую пользователь выдаст, например:

Anika 14 Dan 16

Я хочу прочитать каждый токени присвойте String name, Int, age, String name, int age. в этой последовательности. Это легко, однако, если пользователь вводит Anika Anika Anika Anika 13 13 13 Dan 16

Тогда я хочу, чтобы программа:

Anika, 
Integer needed got String, 
Integer needed got String, 
Integer needed got String, 
13, 
String needed got Integer, 
String needed got Integer, 
Dan, 
16 

Итак, первым всегда будет строка, котораяСлово РЕДАКТИРОВАТЬ: «слово», вторая строка типа int и thrid, которая является «словом», и четвертая строка типа int. Однако я не могу это смоделировать.

Scanner scan = new Scanner(System.in);
String name = null;
int age = 0;
String name2= null;
int age2= 0;
                if(scan.hasNext() == true)
        name = scan.next();
            age = scan.nextInt();
        name2= scan.next();
            age2= scan.nextInt();

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

 boolean isstring = false;
  boolean isnumber = false;
    do {
    if (scan.hasNext())
    {
        name = scan.next();
        isstring = true;
    }
    else {

        System.out.println("Need String got Integer");
        isstring = false;
        scan.next();

    }
    } while (!isstring);


    do {
    if (scan.hasNextInt())
    {
        age = scan.nextInt();
        isnumber=true;
    }
    else {

        System.out.println("Need Integer got String");
        isnumber=false;
        scan.nextInt();

    }
    } while (!isnumber);



    do {
    if (scan.hasNext())
    {
        name2 = scan.next();
        isstring = true;
    }
    else {

        System.out.println("Need String got Integer");
        isstring = false;
        scan.next();

    }
    } while (!isstring);


    do {
    if (scan.hasNextInt())
    {
        age2 = scan.nextInt();
        isnumber = true;
    }
    else {

        System.out.println("Need Integer got String");
        isnumber=false;
        scan.nextInt();

    }
    } while (!isnumber);


    }

Я пытался использовать do в то время как с ifs, и это не сработало. Моя логика где-то неверна, и я думаю, что это может быть метод has.next ().

Любая помощь будет оценена !!

1 Ответ

1 голос
/ 03 ноября 2019

Если при ожидании целого числа входное слово является словом, оно выдаст исключение InputMismatchException. nextInt() сначала прочитайте значение как строку, а затем проанализируйте его как целое число, поэтому, если вы игнорируете значение с помощью nextInt, если значение является словом, оно сгенерирует вышеупомянутое исключение.

Использование того же самогологика вашей программы

Изменения должны быть:

  1. Игнорировать ввод с помощью scan.next()
  2. Проверить, может ли строка быть целым числом или нет (используя scan.hasNextInt()), а не if является строкой, поскольку любое целое число может быть выражено в виде строки.
  boolean isstring = false;
  boolean isnumber = false;

  do {
   if (!scan.hasNextInt()) {
    isstring = true;
    name = scan.next();
   } else {
    isstring = false;
    System.out.println("Need String got Integer");
    scan.next();
   }
  } while (!isstring);

  do {
   if (scan.hasNextInt()) {
    isnumber = true;
    age = scan.nextInt();
   } else {
    isnumber = false;
    System.out.println("Need Integer got String");
    scan.next();
   }
  } while (!isnumber);

  do {
   if (!scan.hasNextInt()) {
    isstring = true;
    name2 = scan.next();
   } else {
    isstring = false;
    System.out.println("Need String got Integer");
    scan.next();
   }
  } while (!isstring);

  do {
   if (scan.hasNextInt()) {
    isnumber = true;
    age2 = scan.nextInt();
   } else {
    isnumber = false;
    System.out.println("Need Integer got String");
    scan.next();
   }
  } while (!isnumber);

Использование try / catch и одного цикла

Наивное решение с использованием try/ catch может быть следующим

public static void main (String[]args)
  {
    String name = null;
    String name2 = null;
    Integer age = null;
    Integer age2 = null;
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext())
      {
    try
    {
      if (name == null)
        {
          System.out.println("Please provide name: ");
          name = getNameOrFail(scan);
          System.out.println("Name set: " + name);
        }
      if (age == null)
        {
          System.out.println("Please provide age: ");
          age = getAgeOrFail(scan);
          System.out.println("Age set: " + age);
        }
      if (name2 == null)
        {
          System.out.println("Please provide name2: ");
          name2 = getNameOrFail(scan);
          System.out.println("Name2 set: " + name2);
        }
      if (age2 == null)
        {
          System.out.println ("Please provide age2: ");
          age2 = getAgeOrFail (scan);
          System.out.println ("Age2 set: " + age2);
        }
    }
    catch (Exception e)
    {
      System.out.println(e.getMessage ()); // Print the message put int Exception(message) constructor
      scan.nextLine(); // Flush the Scanner cache
    }
      }
  }

  public static String getNameOrFail(Scanner scan) throws Exception
  {
    if (scan.hasNextInt())
      throw new Exception("Need String got Integer");
    return scan.next();
  }

  public static Integer getAgeOrFail(Scanner scan) throws Exception
  {
    if (!scan.hasNextInt())
      throw new Exception("Need Integer got String");
    return scan.nextInt();
  }

Обратите внимание на scan.newLine() в предложении catch, это необходимо, потому что Сканер использует кэш с последним вводом, поэтому, если вы не перечитываете, вы вводитев состоянии бесконечного цикла.

Удачи!

...