2015-04-27 4 views
2

Я должен решить следующее упражнение:Почему это простое регулярное выражение/сканер не работает?

Создайте сканер клавиатуры, в котором токены являются целыми без знака, и напишите код, чтобы определить сумму целых чисел.

Примечание: -5 будет проверяться как целое число без знака 5, а знак минус будет пропущен в качестве разделителя

это мое решение (не работает):

import java.util.*; 

public class testing{ 

    public static void main(String[] argv){ 

     testing p = new testing(); 
    } 

    public testing(){ 

     Scanner myScanner = new Scanner(System.in); 
     String regex = "\\s+|-"; 
     myScanner.useDelimiter(regex); 

     int sum = 0; 

     while(myScanner.hasNextInt()){ 

      int partial = myScanner.nextInt(); 
      sum += partial; 
     } 

     System.out.println(sum); 
    } 
} 

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

-2 
3 
4 
f (used to stop the program) 

извлечет 9. но

3 
-2 

остановит программу и получить 3

Я пытаюсь понять причину такого поведения, но не повезло до сих пор ,

+0

Поскольку вы строго работаете с числовыми значениями и выполняете числовые операции, вам может потребоваться использовать числовые функции, в первую очередь методы 'Math.abs()'. – npinti

+0

@npinti, который будет работать, но упражнение требует «знак минуса будет пропущен как разделитель», поэтому я считаю, что метод «useDelimiter» должен использоваться для решения проблемы. – kawrlz

+0

Я худею, чтобы ваше регулярное выражение было '' \\ s + | \ \ s * - "(или что говорит sheltem, это будет потреблять пробелы до - и не менее 1 символа, sheltem потребляет хотя бы один символ и любое количество пробелов и пробелов) – maraca

ответ

5

Вы используете OR в регулярном выражении, что означает, что он просто поглощает разрыв строки, а затем останавливается на «-», потому что он больше не используется в качестве разделителя.

Входной сканер видит:

-2 \ n3 \ n4 \ Н.Ф.

'е' является первым, что после того, как целое число, не соответствует вашей картины непечатаемых ИЛИ один минус.

Вторая модель, хотя требует как быть согласован против вашего разделителя:

3 \ п-2

Так разрыв строку (пробел), согласованный по сравнению с вашим разделяющим шаблоном и минус остается непревзойденным. Так как это не Integer .hasNextInt() возвращает false.

Повторяемая группа непечатаемых и минус работает, как вы намерены:

final String regex = "[\\s-]+"; 

Это может в конечном итоге принимать более, чем ваше упражнение требует, как и нескольких знаков минус перед числом. Если это не приемлемо, вы можете, конечно, ограничить минус один вхождение после неопределенного количества непечатаемых:

final String regex = "[\\s]*-?"; 

В «?» означает «один раз или вовсе» и ограничивает наличие минусов.

Edit:

Как @maraca отметил в комментарии, предложенные ранее мое решение работает только для отдельных значных чисел, как образец принимает пустую строку, а также. Решение, которое работает для чисел> 9, а также является:

final String regex = "\\s+|\\s*-"; 

Что она делает это потреблять либо один или несколько пробельных ИЛИ ноля или более пробелов, сопровождаемый знаком минуса.

Оказывается, даже небольшие вещи, подобные этим, могут быть довольно сложными. -.-

+0

Почему разрыв строки в первом случае но не во втором? – Maroun

+1

В своем первом примере есть * только * линия, чтобы потреблять, а не минус. Его образец потребляет только один ИЛИ другой, ни тот, и другой. Так что linebreak + минус не потребляется его разделителем. – sheltem

+0

Очень хорошее объяснение, молодец. – Maroun

-1

Вы можете решить, ловя InputMismatchException так:

public Testing(){ 

     Scanner myScanner = new Scanner(System.in); 
     String regex = "\\s+|-"; 
     myScanner.useDelimiter(regex); 

     int sum = 0; 

     while(myScanner.hasNext()){ 
      int partial = 0; 
      try{ 
       partial = myScanner.nextInt(); 
      } catch(InputMismatchException e){ 
       continue; 
      } 
      sum += partial; 
     } 

     System.out.println(sum); 
} 

Вопрос в том, вы пытаетесь разобрать Int, но вы получаете «-».

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