从文件中读取双精度值

我正在尝试从文件中读取一些数字(double)并将它们存储在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后将数值插入到数组中,但它仍然不起作用 – ‘而’循环不是一次执行。

我尝试将代码缩减为仅测试扫描仪本身。 以下代码适用于您的数据文件:

 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 

试试这个以确保您引用了正确的文件。

下面是我对你的代码的再现,以使其运行。 它立即爆炸,带有索引exception的数组。

那么:你能给我们一点框架吗? 和我做的有什么不同?

 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 tmp = new ArrayList(); 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) 

首先尝试设置分隔符:

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

的JavaDoc

我有同样的问题(不工作扫描仪),解决方案似乎非常容易。 您只需为其设置区域设置即可。

  // 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