2015-11-15 3 views
0

У меня есть некоторые проблемы, когда я прошу пользователя ввести некоторые цифры, а затем я хочу их обработать. Посмотрите на код ниже, пожалуйста.Разделитель Java-сканера и System.in

Чтобы программа работала правильно, мне нужно ввести две запятые в конце, а затем это нормально. Если я не помещаю 2 запятых в программу, а затем программа не хочет закончить или я получаю сообщение об ошибке.

Может ли кто-нибудь помочь мне с этим? Что мне делать, чтобы не вводить эти запятые в конце

package com.kurs; 

import java.util.Scanner; 

public class NumberFromUser { 

    public static void main(String[] args) { 
     String gd = "4,5, 6, 85"; 
     Scanner s = new Scanner(System.in).useDelimiter(", *"); 
     System.out.println("Input some numbers"); 
     System.out.println("delimiter to; " + s.delimiter()); 
     int sum = 0; 
     while (s.hasNextInt()) { 

      int d = s.nextInt(); 

      sum = sum + d; 

     } 
     System.out.println(sum); 
     s.close(); 
     System.exit(0); 

    } 

} 
+0

в цикле в то время как вы можете пойти навсегда не Limite той буксировочного запятые силу вам выйти из цикла, вы должны иметь некоторый LIMITE из whil цикла или некоторой вещь, чтобы выйти из цикла – Abdelhak

ответ

3

Ваша программа зависает в s.hasNextInt().

Из документации Сканер класса:

Следующая() и методы hasNext() и их примитивного типа компаньонов методов (таких как nextInt() и hasNextInt()) первый пропустить любой введите, что соответствует шаблону разделителя, а затем попытайтесь вернуть следующий токен . Оба hasNext и следующие методы могут блокировать ожидание ввода .

В нескольких словах, сканер просто ждет дополнительного ввода после последнего целого, потому что он должен найти свой разделитель в виде регулярного выражения «*» решить, что последнее число есть полностью напечатан.

Вы можете прочитать больше о вашей проблеме в этой дискуссии:

Link to the discussion on stackoverflow

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

import java.util.Scanner; 

public class NumberFromUser { 

public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 

     String[] tokens = sc.nextLine().split(", *"); 

     int sum = 0; 

     for (String token : tokens) { 
      sum += Integer.valueOf(token); 
     } 

     System.out.println(sum); 
    } 

} 
+0

Спасибо большое. Это объясняет все :) Очень полезный ответ для меня! – EdXX

0

Посмотрите, что вы можете сделать что-то вроде этого mmm.

public static void main(String[] args) { 
     Scanner s = new Scanner(System.in); 
     System.out.println("Input some numbers"); 
     System.out.println("When did you to finish and get the total sum enter ,, and go"); 
     boolean flag = true; 
     int sum = 0; 
     while (s.hasNextInt() && flag) { 

      int d = s.nextInt(); 
      sum = sum + d; 
     } 

     System.out.println(sum); 

    } 
0

Try позволяет конец строки, чтобы быть разделителем тоже:

Scanner s = new Scanner(System.in).useDelimiter(", *|[\r\n]+"); 
+0

К сожалению, этот не работает в моем случае :( – EdXX

0

Я изменил ваше решение немного и, возможно, у меня это не самый лучший, но это, кажется, работает:

Scanner s = new Scanner(System.in); 
    System.out.println("Input some numbers"); 
    int sum = 0; 
    if (s.hasNextLine()) { 
     // Remove all blank spaces 
     final String line = s.nextLine().replaceAll("\\s",""); 

     // split into a list 
     final List<String> listNumbers = Arrays.asList(line.split(",")); 

     for (String str : listNumbers) { 
      if (str != null && !str.equals("")) { 
      final Integer number = Integer.parseInt(str); 
      sum = sum + number; 
      } 
     } 
    } 
    System.out.println(sum); 
+0

Спасибо за код, но я хотел бы знать, как это сделать, используя «,» delimeter и while loop – EdXX

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