如何将文本文件中的双打扫描到数组中?

时间:2016-09-25 23:34:51

标签: java arrays

我有一个看起来像这样的文本文件:

  

苹果

     

10.1 20 11 21.3 31 12.7 22 32.4 42 13

第一行是公司名称,第二行代表它的股票价格。

我想将所有双打扫描到一个数组中,以便我可以执行计算。

这是我的代码

public static void main(String[] args) throws FileNotFoundException {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Select A File");
    String FileName = keyboard.next();

    Scanner linReader = new Scanner(new File(FileName));

    double[] values = new double[10];

    while (linReader.hasNextLine()) {
        linReader.nextLine(); // skips company name
        String line = linReader.nextLine();

        // store following doubles into array
        int nums = 0; //

        if (linReader.hasNextDouble()) {
            values[nums] = linReader.nextDouble();
            nums++;
        }

    }
    linReader.close();
    System.out.println(Arrays.toString(values)); //prints out array 'values'
}

我选择文件,然后跳过第一行(包含公司名称)。

然后我初始化一个数字以跟踪数组中的indeces。如果该行有另一个double,那么它将被添加到索引'num'的数组中,'num'将增加1,这将继续,直到没有更多的双倍。

至少这是它背后的逻辑。但输出总是出现

  

[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]

我不确定为什么会发生这种情况或如何解决它。

3 个答案:

答案 0 :(得分:0)

我想linReader.nextDouble()在之前读取的行之后正在寻找一个双

尝试删除对nextLine()的一次通话。如果这没有帮助,请使用此算法:

linReader.nextLine(); // skips company name
String line = linReader.nextLine();
String[] strings = line.split(" ");

for (int i = 0; i < strings.length; i++) {
    try {
        values[nums++] = Double.parseDouble(strings[i]);
    } catch (NumberFormatException e) {
    } catch (ArrayIndexOutOfBoundsException e) {
        break;
    }
}

答案 1 :(得分:0)

解释

原因是你没有使用双线,然后双数组有默认值,即0.0。这一行:

String line = linReader.nextLine();

是问题的一部分。当您执行以下行时:

linReader.nextLine(); // skips company name
String line = linReader.nextLine();

您希望跳过公司行的第一行(lineReader.nextLine),它显示为Apple。这一切都很好,但是当你这样做时,

String line = linReader.nextLine();

这将读取双打行。然后,您的if永远不会执行,因为文件中没有更多要读取的内容,因此双数组的值不会分配默认值以外的值。打印line您会看到:

10.1 20 11 21.3 31 12.7 22 32.4 42 13

然后你可以这样做:

for(int i = 0; i < line.split(" ").length; i++) {
    values[i] = Double.parseDouble(line.split(" ")[i]);
}

而不是if语句。然后它将正确输出:

[10.1, 20.0, 11.0, 21.3, 31.0, 12.7, 22.0, 32.4, 42.0, 13.0]

上面的代码执行传统的C风格for循环。它遍历通过执行line.split(" ")创建的双精度数组,它将空间中的所有值拆分为数组。这创造了:

["10.1", "20", "11, "21.3", "31", "12.7", "22", "32.4", "42", "13"]

接下来,您只需循环遍历all,使用当前迭代或索引访问values数组,并将其分配给上面字符串数组中当前元素的解析后的double。您可以根据需要格式化并捕获任何异常。

TL; DR

这是while循环中的最终代码:

String companyName = linReader.nextLine(); // if you want the company name, this stores it
String line = linReader.nextLine(); // this contains all double values in a string

for(int i = 0; i < line.split(" ").length; i++) { // loops over all doubles in split string array
    values[i] = Double.parseDouble(line.split(" ")[i]); // parses them as doubles and then stores to double array
}

答案 2 :(得分:0)

也许您可以像这样更改代码:

public static void main(String[] args) throws FileNotFoundException {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("Select A File");
    String FileName = keyboard.next();

    Scanner linReader = new Scanner(new File(FileName));

    Vector<Double> values = new Vector<>();

    while (linReader.hasNextLine()) {
        linReader.nextLine(); // skips company name
        String line = linReader.nextLine();
        String _line[] = line.split(" ");

        for (String item : _line) {
            if (!item.isEmpty()) {
                values.add(Double.parseDouble(item));
            }
        }
    }
    linReader.close();
    System.out.println(values.toString()); //prints out array 'values'
}