Если стоит задача просто ввести целые числа в список, достаточно придерживаться однородного подхода:
- Использовать
Scanner::nextInt (+ дополнительно проверять поток ввода Scanner::hasNextInt)
- Использовать построчный ввод
Scanner::nextLine + Integer.parseInt / Integer.valueOf(String str)
Важно помнить, что по умолчанию разделителями в сканере являются только пробельные символы типа ' ', '\t', '\n'. Если ввод содержит другие разделительные символы, например, знаки пунктуации ',', '.', ';', сканер придётся дополнительно сконфигурировать при помощи метода Scanner::useDelimiter.
Примеры.
- Ввод размера списка/массива и последующее заполнение.
Достаточно использовать только метод Scanner::nextInt:
public static List<Integer> readIntList(Scanner scan) {
List<Integer> list = new ArrayList<>();
System.out.println("Введите количество целых чисел: ");
int n = scan.nextInt();
System.out.println("Введите " + n + " чисел через пробел");
while (n-- > 0) {
list.add(scan.nextInt());
}
return list;
}
- Ввод списка произвольной длины, пока не будет обнаружено некоторое число -- признак конца ввода (0 для ввода натуральных чисел, -1 -- для ввода неотрицательных чисел и т.п.)
public static List<Integer> readIntList(Scanner scan, int limit) {
List<Integer> list = new ArrayList<>();
System.out.println("Вводите целые числа, пока не будет введено число " + limit + " -- признак конца ввода");
int n;
while ((n = scan.nextInt()) != limit) {
list.add(n);
}
return list;
}
Как видно, оба метода достаточно просты благодаря тому, что используются одинаковые методы как для ввода основного содержимого списка, так и для ввода "ограничителей".
- Ввод списка чисел произвольной длины, пока не будет введена команда выхода (слово или буква)
Фактически, это исправленный вариант начального кода.
Для организации выхода будет использоваться особое множество слов Set<String> stopWords.
Если же пользователь введёт "непонятное" слово или число, они будут проигнорированы.
public static List<Integer> readIntList(Scanner scan, Set<String> stopWords) {
List<Integer> list = new ArrayList<>();
System.out.println("Вводите целые числа, пока не будет введено одно из слов: " + stopWords);
while (true) {
if (scan.hasNextInt()) {
list.add(scan.nextInt());
} else if (scan.hasNext()) {
if (stopWords.contains(scan.next().toLowerCase())) {
break;
}
}
}
return list;
}
- Обработка построчного ввода, пока не будет введена пустая строка или же строка, содержащая только пробелы.
Здесь будет использоваться Scanner::nextLine, для простоты примем, что каждое число вводится в своей строке:
public static List<Integer> readIntListByLine(Scanner scan) {
List<Integer> list = new ArrayList<>();
System.out.println("Введите список целых чисел, каждое в своей строке, конец ввода -- пустая строка");
String line;
while (!(line = scan.nextLine().trim()).isEmpty()) { // trim() уберёт пробелы
try {
list.add(Integer.valueOf(line));
} catch (NumberFormatException numfex) {
// numfex.printStackTrace();
}
}
return list;
}
Аналогично можно реализовать проверку на ввод команды для прекращения ввода.
scanner.nextLine();Scannerне считывает строку послеnextInt(); Заполнение матрицы scanner'ом. Один scanner работает не верно – Nowhere Man Nov 14 '23 at 12:22nextInt, следовало использоватьnext, а неnextLine– Nowhere Man Nov 14 '23 at 12:29nextLineдля ввода каждого числа с отдельной строки, НЕ нужно использоватьnextInt, а читаете ввод построчно -- тогда вы сможете проверить и пробел/пустую строку как условие выхода. – Nowhere Man Nov 14 '23 at 12:37'q', но дело в том, что после пробела всё равно придётся нажимать Enter, чтобы была введена строка. Также в этом коде нет "защиты" от кривого ввода (может быть исключение при парсинге числа). – Nowhere Man Nov 14 '23 at 19:04