2017-02-16 4 views
-3

Я пытаюсь читать координаты из файла. Формат - это начальная точка, конечная точка, многоугольники. Вот пример:Почему Scanner.nextDouble бросает InputMismatchException для чисел, разделенных символами «,» или «;»?

1, 3 
34, 19 
0, 14; 6, 19; 9, 15; 7, 8; 1, 9 
2, 6; 17, 6; 17, 1; 2, 1 

Я прочитал каждую строку с использованием BufferedReader и подтвердил, что работает. Я пытаюсь использовать Scanner, чтобы проанализировать каждую строку для чисел как удвоений, поэтому я использую метод Scanner, но когда я запускаю код, он выдает InputMismatchException при первом чтении. Вот логика этих строк:

линия Файл - "1, 3"

Код: lineReader.nextDouble();

Любые идеи?

+1

где ваш код. дайте нам некоторые важные детали. – msagala25

+0

Код длиной несколько сотен строк и здесь не очень полезен, но я немного добавлю к вопросу. – Pareod

+0

Эти сотни строк почти всегда могут быть сжаты в [MCVE] (http://stackoverflow.com/help/mcve), которые могут быть или не быть связаны с исходным кодом. – yeputons

ответ

-1

Scanner.next() is '1,', тип String.

Try ниже код:

while(scanner.hasNext()){ 
     if (scanner.hasNextDouble()) { 
      System.out.println("double="+scanner.nextDouble()); 
     }else{ 
      System.out.println("string="+scanner.next()); 
     } 
    } 

Тогда вы можете понять.

0

Обращайтесь к классу Scanner. Его пример, как использовать разделители с Scanner.

Сканер з = новый сканер (вход) .useDelimiter ("\\ с * рыба \\ с *");

Ниже приведен пример, который читает ваши данные из файла.

public static void main(String[] args) { 
    try (Scanner in = new Scanner(new File("D:/INPUT_OUTPUT/Data_Stack.txt"))) { 

     // Adding delimiters. 
     in.useDelimiter("\\s*,\\s*|\\s*\\n\\s*|\\s*;\\s*"); 

     // Reading files. 
     while (in.hasNextDouble()) { 
      System.out.println(in.nextDouble()); 
     } 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

данных в файле (Data_Stack.txt) -:

1, 3 
34, 19 
0, 14; 6, 19; 9, 15; 7, 8; 1, 9 
2, 6; 17, 6; 17, 1; 2, 1 

output-:

1.0 
3.0 
34.0 
19.0 
0.0 
14.0 
6.0 
19.0 
9.0 
15.0 
7.0 
8.0 
1.0 
9.0 
2.0 
6.0 
17.0 
6.0 
17.0 
1.0 
2.0 
1.0 

Description-: Из Scanner мы можем видеть, что -:

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

Поэтому мы должны добавить требуемый разделитель, чтобы прочитать наши данные. Необходимыми разделителями являются ,, \n и ;, которые были добавлены в строку in.useDelimiter("\\s*,\\s*|\\s*\\n\\s*|\\s*;\\s*"); кода.
После добавления разделителей в Scanner его данные для чтения правильно.

+0

Я прочитал пример разделителя, но на самом деле это не слишком хорошо объясняет. Является ли лишний '\\' 'в' \\ s * 'символом прерывания? '|' означает OR. Зачем нам нужно любое количество пробелов между ',', ';' и '\ n'? Также, как черт вы просто пишете символ разрыва в кодовых котировках haha – Pareod

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