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

Проблема

Привет, ребята, моя проблема в том, чтобы выяснить, как добавлять целые числа из объекта сканера в массив. Предостережение заключается в том, что сканер должен прекратить принимать целочисленные значения, когда целое число меньше 0. Другими словами, независимо от длины введенного массива, он должен прекратить принимать целочисленные значения, как только сканер обнаружит отрицательное значение. В этом вопросе используется язык Java.

Оттуда он должен распечатать введенный массив.


Пример:

Когда ввод -

12 22 22 23 25 -1

, он должен немедленно остановить сканер на -1 и вывести следующий массив:

12 22 22 23 24-1

Что я пробовал

Поскольку массиву нельзя присвоить фиксированный размер для стандартного массива, я выбрал массив Список, который даст возможность добавлять столько значений из объекта сканера. Как только я понял этот шаг, я выполнил простую пользовательскую проверку для любых введенных целых чисел, которая выглядит следующим образом:

public static void main(String[] args) {
   //  Initiate scanner and a new array
   Scanner scnr = new Scanner(System.in);
   ArrayList<Integer> userValues = new ArrayList<Integer>();

   System.out.print("Enter numbers: ");

   //  While the scanner reads an integer, add integers to the array list
   while (scnr.hasNextInt()) {
      userValues.add(scnr.nextInt());
   }

   //  Print out the array list
   System.out.println(userValues);
 }


Входные и выходные данные для вершины будут такими. ВХОД

1 2 3 45 32 1 L

ВЫХОД

[1, 2, 3, 45, 32, 1]


Это работает только для базовой c проверки целых чисел и останавливает ввод строки или других типов данных в массив. Кажется, я не могу понять, как остановить объект сканера и сохранить весь массив. Следующий код - моя попытка решить проблему:

public static void main(String[] args) {
   //  Initiate scanner and new array
   Scanner scnr = new Scanner(System.in);
   ArrayList<Integer> userValues = new ArrayList<Integer>();
   boolean isPositive = true;

   System.out.print("Enter numbers: ");

   //  TODO: Once the user enters a value less than 0, break the loop
  while(scnr.hasNextInt() && isPositive) {
     if(scnr.nextInt() < 0) {
       isPositive = false;
     } else {
       userValues.add(scnr.nextInt());
     }
   }
   System.out.println(userValues);
}

При неудачных попытках это не работает и дает мне странные результаты, которые я не могу понять.


ВХОД

1 23 45 -1 -1

ВЫХОД

[23, -1 ]



Я ценю помощь.

Ответы [ 4 ]

1 голос
/ 08 мая 2020

Чтобы остановить сканер и успешно распечатать результат, вы должны просто вызвать оператор if и сказать:

if(num < 0){
--your condition---
}

Примечание. Я использовал «num» в качестве примера, переменная должна быть быть переменной сканера, чтобы сканер остановился, иначе, если вы зададите условие с переменной, которая не является переменной сканера, сканер не остановится.

1 голос
/ 05 мая 2020

Можно немного упростить.

https://ideone.com/GmZ7nH#stdin

 Scanner scnr = new Scanner(System.in);
   ArrayList<Integer> userValues = new ArrayList<Integer>();
   System.out.print("Enter numbers: ");

   //  TODO: Once the user enters a value less than 0, break the loop
  while(scnr.hasNextInt()) {
     int temp = scnr.nextInt(); 
     if( temp < 0) {
       break;
     } else {
       userValues.add(temp);
     }
   }
   System.out.println(userValues);
    }
0 голосов
/ 05 мая 2020

А как насчет проверки ввода -ve в начале l oop?

    int val;
    while ((val = scnr.nextInt()) >= 0){
        userValues.add(val);
    }

    // Print out the array list
    System.out.println(userValues);
0 голосов
/ 05 мая 2020

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

while(scnr.hasNextInt() && isPositive) {
     int next = scnr.nextInt();
     if(next < 0) {
       isPositive = false;
     } else {
       userValues.add(next);
     }
   }
...