Как получить Java hasNextInt (), чтобы остановить ожидание целых без ввода символа? - PullRequest
0 голосов
/ 30 сентября 2011

Мне дали следующий код и попросили написать класс Solution, выходящий из TestList.Я написал для него конструктор (который только что называется super) и метод printSecond2 (), вызванный в последней строке кода ниже.Все остальные методы наследуются.Вот код:

public class Test3A {
    public static void main(String[] args) {
        TestList tl = new Solution();
        tl.loadList();
        ((Solution) (tl)).printSecond2();//prints every second element
    }
}

Однако, черт возьми, никогда ничего не печаталось, поэтому я пошел в класс TestList (который был предоставлен) и поместил операторы println после каждой отдельной строки метода loadList ():

   public void loadList ()
   {
      if (input.hasNextInt ())//input is a Scanner object
      {
         int number = input.nextInt ();
         loadList ();
         add (number);
      }
   }

Я обнаружил, что могу продолжать добавлять пробельные символы, символы новой строки и целые числа бесконечно, и что метод add (number) наконец-то вызывается только тогда, когда я ввожу символ.Так что, если я этого не сделаю, это просто зависает в ожидании большего ввода вместо того, чтобы двигаться дальше.

Я смущен этим, поскольку предоставленный пример ввода / вывода:

пример ввода

1 2 3 4 5

пример вывода

2 4

Таким образом, автоматический маркер не вводит никаких символов.

Я попытался переопределить метод в Solution (мыне может касаться других классов) и:

  1. ), изменяя if на while
  2. ), добавляя блок else
  3. ), добавляя else if (! input).hasNextInt ())

Ничто из этого ничего не изменило.Я понятия не имею, как программа должна двигаться дальше и доходить до printSecond2().

Есть мысли?Я действительно хотел бы пройти мой следующий тест на практике: D

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Когда пользователь должен ввести последовательность чисел, либо должно быть указано количество элементов, либо ввод должен быть прекращен каким-либо образом. 1 2 3 и 1 2 3 4 являются допустимыми входами, поэтому сканер не может решить, где закончить самостоятельно. Можно предположить, что числовая последовательность заканчивается символом EOF Ctrl-Z на окнах и Ctrl-D на Unix, поскольку никакой другой информации не предоставляется.

0 голосов
/ 26 октября 2014

Есть способ остановить Scanner в конце строки. Вам необходимо определить разделитель, содержащий пробел, пустое выражение, но не следующий символ строки:

public static void main(final String[] args) {
    Scanner scan = new Scanner(System.in).useDelimiter(" *");
    while (scan.hasNextInt() && scan.hasNext()) {
    int x = scan.nextInt();
    System.out.println(x);
    }

}

Таким образом, Scanner видит \n, за которым следует разделитель (ничего), и ввод останавливается после нажатия возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...