Чтение двойных значений из файла - PullRequest
4 голосов
/ 06 декабря 2009

Я пытаюсь прочитать некоторые числа (двойные) из файла и сохранить их в ArrayList и массиве (да, мне нужны оба) с кодом ниже:

try {
    Scanner scan = new Scanner(file).useDelimiter("\\s*\\n");

    while(scan.hasNextDouble())
    {
        tmp.add(scan.nextDouble());
    }

    Double[][] tmp2 = new Double[tmp.size()/2][2];
    int tmp3 = 0;
    for(int i = 0; i < tmp.size()/2; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            tmp2[i][j] = tmp.get(tmp3);
            tmp3++;
        }
    }

} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

}

Файл, который я пытаюсь прочитать:

0.0 0.0
0.023 0.023
0.05 0.05
0.2 0.2
0.5 0.5
0.8 0.8
0.950 0.950
0.977 0.977
1.0 1.0

Но мой код не работает, функция hasNextDouble () ничего не находит, что я делаю не так?

РЕДАКТИРОВАТЬ: хорошо, поэтому я немного отредактировал источник (изменен с Object [] [] на Double [] []) и добавил вставку значений в массив после того, как они были вставлены в ArrayList, но он все еще не работает - цикл while не выполняется ни разу.

Ответы [ 4 ]

4 голосов
/ 06 декабря 2009

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

public static void main(String[] args) {
    Scanner scan;
    File file = new File("resources\\scannertester\\data.txt");
    try {
        scan = new Scanner(file);

        while(scan.hasNextDouble())
        {
            System.out.println( scan.nextDouble() );
        }

    } catch (FileNotFoundException e1) {
            e1.printStackTrace();
    }

}

Я получил следующий (ожидаемый) вывод:

0.0
0.0
0.023
0.023
0.05
0.05
0.2
0.2
0.5
0.5
0.8
0.8
0.95
0.95
0.977
0.977
1.0
1.0

Попробуйте, чтобы убедиться, что вы ссылаетесь на правильный файл.

1 голос
/ 04 сентября 2014

У меня была такая же проблема (не работает сканер), и решение кажется на удивление легким. Вам просто нужно установить локаль для него.

  // use US locale to be able to identify doubles in the string
  scanner.useLocale(Locale.US);

взято отсюда: http://www.tutorialspoint.com/java/util/scanner_nextdouble.htm

1 голос
/ 06 декабря 2009

Ниже мое исполнение вашего кода, адаптированного для его запуска. Он немедленно взрывается с исключениями индексации массива.

Итак: Можете ли вы дать нам немного больше рамок? Что отличается от того, что я сделал?

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Zenzen {

   private static ArrayList<Double> tmp = new ArrayList<Double>();

   private static File file = new File("Zenzen.dat");

   public static void main(String[] args) {

      Scanner scan;
      try {
         scan = new Scanner(file);
         Object[][] tmp2 = new Object[tmp.size() / 2][2];
         int tmp3 = 0;

         while (scan.hasNextDouble()) {
            tmp.add(scan.nextDouble());
            System.out.println(Arrays.deepToString(tmp.toArray())); // debug print
            for (int i = 0; i < tmp.size() / 2; i++) {
               for (int j = 0; j < 2; j++) {
                  tmp2[i][j] = tmp.get(tmp3);
                  tmp3++;
               }
            }
         }

      } catch (FileNotFoundException fnfe) {
         fnfe.printStackTrace();
      }
   }
}

[0.0]
[0.0, 0.0]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Zenzen.main(Zenzen.java:26)
0 голосов
/ 06 декабря 2009

Попробуйте сначала установить разделитель:

scan.useDelimiter("\\s+");

JavaDoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...