0

我有一个文本 (file.txt) 文件。该文件加载在扫描仪内。

在文件中有不同的行,每行有两个双精度值和一个整数值除以空格。

像这样:

1.0 1.2 2
0.9 1.0 10
50.4 9.2 20

我需要完成三个数组。

每个数组对应一列。就像是:

double[] x = {1.0,0.9,50.4}
double[] y = {1.2,1.0,9.2}
double[] z = {2,10,20}

我尝试使用此代码:

        double x[]= new double [3];
        double y[]= new double [3];
        double z[]= new double [3];

        File f = new File(ClassLoader.getSystemResource(file.txt).toURI());
        Scanner sc = new Scanner(f);
        String aux;

        for (int i=0;i<3;i++){
               aux = sc.next();
               x[i] = Double.parseDouble(aux);
               aux = sc.next();
               y[i] = Double.parseDouble(aux);
               aux = sc.next();
               z[i] = Double.parseDouble(aux);
       }

但是当第一个 Double.ParseDouble() 我得到“NumberFormatException”。

我进行了调试,变量 aux 具有双精度值(例如:1.0),因此 Double.parseDouble(aux) 应该可以工作。

奇怪的是它说(当异常启动时)“aux”类似于 '1.0(之前带有 ')

有没有办法删除每个符号:比如 ' 或 , 或 . 或“bom”(如“特殊空间”)等等?我的意思是..不需要指定可能符号的完整列表,因为我不知道文件的“不可见”符号列表(我的意思是:编辑文件时我看不到的符号)。

谢谢你的任何提示。

4

1 回答 1

2

您确定您的文件输入与您所说的完全一样吗?

我将您的确切文件输入复制/粘贴到一个名为“numbers.txt”的文件中并运行下面的类。似乎完全按预期工作:

public class NumberParser
{
    public static void parseData(String resourceName)
    {
        Scanner s = new Scanner(NumberParser.class.getResourceAsStream(
             resourceName));

        double [] x = new double[3];
        double [] y = new double[3];
        int [] z = new int[3];

        for (int i = 0; i < 3; i++)
        {
            x[i] = s.nextDouble();
            y[i] = s.nextDouble();
            z[i] = s.nextInt();
        }

        System.out.println(Arrays.toString(x));
        System.out.println(Arrays.toString(y));
        System.out.println(Arrays.toString(z));
    }

    public static void main(String[] args)
    {
        parseData("numbers.txt");
    }
}

如果您的输入与您所说的不完全一样(使用逗号、引号等),但基本上是由这些标记分隔的数字,您可以将分隔符(有意义的标记之间的内容)设为除您要查找的内容之外的任何内容:

public static void parseMessedUpData(String resourceName)
{
    Scanner s = new Scanner(NumberParser.class.getResourceAsStream(
        resourceName));
    s.useDelimiter("[^0-9.]++"); // <-------

    double [] x = new double[3];
    double [] y = new double[3];
    int [] z = new int[3];

    for (int i = 0; i < 3; i++)
    {
        x[i] = s.nextDouble();
        y[i] = s.nextDouble();
        z[i] = s.nextInt();
    }

    System.out.println(Arrays.toString(x));
    System.out.println(Arrays.toString(y));
    System.out.println(Arrays.toString(z));
}
于 2012-06-03T13:31:30.260 回答