从文件中读取双精度值
我正在尝试从文件中读取一些数字(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