Класс сканера не распознает много входных данных?

#java #java.util.scanner

#java #java.util.scanner

Вопрос:

 import java.util.Scanner;  // using the Scanner class located in the "java.util" directory

public class Helloworld {

    public static void main(String [] args){

        int number =0, count = 0, sum = 0;
        int Largest= 0, largestEvenNumber = 0;

        do {

            Scanner console = new Scanner(System.in);


            number = console.nextInt();


            if (number > Largest) { // Condition for computing the largest number
                Largest = number;
            }

            if (number < 0) { // Condition for computing the number of negative integers in the sequence
                count = count   1;
            }

            if (number % 2 == 0) { // Condition for computing the largest even integer in the sequence

                if (largestEvenNumber < number) {
                    largestEvenNumber = number;
                }
            }

            if (number % 3 == 0) { // Condition for computing the sum of numbers divisible by 3
                sum  = number;
            }

        }while(number != 0);

        System.out.println("nThe largest integer is "   Largest);
        System.out.println("The number of negative integers in the sequence is "   count);
        System.out.println("The largest even integer in the sequence is "   largestEvenNumber);
        System.out.printf("The sum of numbers divisible by 3 is %d", sum);


    }
}
  
 output:
1
2
3
  

-1,
-2,
-45,
7,
-9,
23,
67,
900,
0
Нет вывода

 Expected output:     
1
2
3
  

-1,
-2,
-45,
7,
-9,
23,
67,
900,
0

 The largest integer is 900;
The number of negative integers in the sequence is 4;
The largest even integer in the sequence is 900;
The sum of numbers divisible by 3 is 849
  

Программа выполняется, когда я вводю входные данные один за другим. Однако, когда я пытаюсь «Скопировать вставить» все входные данные сразу из текстового редактора (входные данные разделены в каждой строке в текстовом редакторе), выходных данных нет. Я думаю, что класс сканера считывает только первое число. Как мне исправить это, не создавая несколько объектов и не вводя каждое число?

Комментарии:

1. Почему вы создаете новые сканеры внутри цикла? Почему бы не создать один перед do-while циклом?

2. » Я думаю, что класс сканера считывает только первое число » Сканер пытается прочитать как можно больше данных и кэшировать оставшуюся часть. Вот почему, когда вы помещаете все данные в одну строку и нажимаете ENTER, они будут прочитаны полностью одним, Scanner и ничего не останется System.in для другого сканера, который будет создан на следующей итерации. Вот почему мы должны использовать один сканер для каждого ресурса (если у вас много методов, требующих обработки сканером System.in затем либо передайте этот сканер в качестве параметра метода, либо создайте в некотором классе поле сканера и получите к нему доступ через getter).

Ответ №1:

Вам не хватает того, как работает класс Scanner:

 try (Scanner scanner = new Scanner(System.in)) {
  while (scanner.hasNextInt()) {
    int n = scanner.nextInt();
    System.out.println("n="   n);
  }
}
  

Вы всегда читали первое число: вы должны сначала проверить, будет ли у вас число, затем прочитать как число, затем повторить попытку до конца файла.

Обратите внимание, что сканер закрывается с помощью try-with-resources, который может оказаться ненужным в случае System.in , но не в другом случае (файлы, …).

Комментарии:

1. Как мне остановить процесс?