2015-01-21 8 views
7

Я пытаюсь отсканировать отрицательное число с помощью класса Scanner в Java.Сканер не сканирует отрицательные числа

У меня есть этот входной файл:

-1,2,3,4

Мой код выглядит следующим образом:

Scanner input = new Scanner(new File("data/input.txt")); 
    int i = input.nextInt(); 
    input.useDelimiter(",|\\s*"); //for future use 
    int a = input.nextInt(); 
    System.out.println(i); 
    System.out.println(a); 

Мой ожидается выход должен быть

-1

вместо этого я получаю сообщение об ошибке (Несоответствие типов).

Когда я

String a = input.next(); 

вместо

int a = input.nextInt(); 

Я больше не получаю сообщение об ошибке, и я вместо того, чтобы получить

-

+1

'input.nextInt();' читает * только * целое значение, то '\ n' не будет потребляться , – Maroun

+0

Я немного смущен. Почему, когда я делаю «код» (input.next()), он не читает \ n, а скорее «-». – 73est

+1

Это потому, что он пропускает разделитель '\ n' (newline), который является символом пробела. – rgettman

ответ

8

Разделитель представляет собой запятую или 0 или более символов пробела ('\ s'). Значение * означает «0 или больше». В Scanner найдено «0 или более» пробельных символов между - и 1, поэтому он разделяет эти символы, что в конечном итоге приводит к исключению входного несоответствия.

Вы должны иметь 1 или более пробельных символов в качестве разделителя, поэтому измените * на +, чтобы отразить это намерение.

input.useDelimiter(",|\\s+"); 

При внесении этих изменений, я получить ожидаемый результат:

1 
-1 
+0

Огромное вам спасибо, не могу поверить, что я этого не замечал. У меня возникли проблемы с поиском документации по этим шаблонам и т. Д. Вы знаете, что я буду искать? – 73est

+0

См. [Javadocs] Pattern (http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html). В нем подробно рассматриваются шаблоны регулярных выражений. – rgettman

Смежные вопросы