Продолжайте читать цифры до новой строки, используя сканер - PullRequest
5 голосов
/ 22 февраля 2011

Я хочу прочитать пару цифр из консоли.Я хочу сделать так, чтобы пользователь ввел последовательность чисел, разделенных пробелом.Код для выполнения следующих действий:

Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()){
    int i = sc.nextInt();

    //... do stuff with i ...
}

Проблема в том, как мне остановиться при достижении новой строки (при сохранении простого для чтения кода выше)?Добавление! HasNextLine () к аргументу, приведенному выше, позволяет немедленно выйти из циклаОдним из решений было бы чтение всей строки и разбор чисел, но я думаю, что это разрушает цель метода hasNextInt ().

Ответы [ 2 ]

7 голосов
/ 22 февраля 2011

Вы хотите установить разделитель следующим образом:

Scanner sc = new Scanner(System.in);
sc.useDelimiter(System.getProperty("line.separator")); 
while (sc.hasNextInt()){
    int i = sc.nextInt();

    //... do stuff with i ...
}

UPDATE:

Код выше работает хорошо, если пользователь вводит число, а затем нажимает ввод. При нажатии клавиши ввода без ввода номера программа прерывает цикл.

Если вам нужно (понимается это скорее как рекомендация по удобству использования) вводить разделенное пространство чисел, взгляните на следующий код:

Scanner sc = new Scanner(System.in);
Pattern delimiters = Pattern.compile(System.getProperty("line.separator")+"|\\s");
sc.useDelimiter(delimiters); 
while (sc.hasNextInt()){
    int i = sc.nextInt();
    //... do stuff with i ...
    System.out.println("Scanned: "+i);
}

Использует Pattern для разделителей. Я установил его так, чтобы он соответствовал пробелу или разделителю строк. Таким образом, пользователь может ввести числа, разделенные пробелами, а затем нажать клавишу ввода, чтобы их отсканировать. Это может повторяться с таким количеством строк, сколько необходимо. Когда это сделано, пользователь просто нажимает ввод снова без ввода номера. Думаю, это очень удобно при вводе многих чисел.

2 голосов
/ 22 февраля 2011

Вы можете использовать sc.nextLine () для чтения строки ввода, а затем создать новый сканер из этой строки (имеется перегрузка конструктора, которая принимает строку) и считывать целые числа из второго сканера.(Примечание. Если это то, что вы имели в виду под «чтением всей строки и разбором чисел», я удалю этот ответ, но, похоже, вы говорили о ручном чтении чисел с помощью Integer.parseInt ()).

...