我正在尝试从文件中读取一些数字(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后将值插入到数组中,但它仍然不起作用 - 'while'循环不会执行一次。答案 0 :(得分:4)
我尝试将代码缩减为仅测试扫描仪本身。以下代码适用于您的数据文件:
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 :(得分:1)
以下是我对您的代码的再现,以使其运行。它立即爆炸,带有索引异常的数组。
那么:你能给我们一点框架吗?和我做的有什么不同?
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)
答案 2 :(得分:1)
我遇到了同样的问题(没有使用扫描仪),解决方案似乎非常简单。 您只需要为其设置区域设置。
// 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
答案 3 :(得分:0)