2016-09-25 56 views
0

我有一个文本文件,它看起来像这样:如何将文本文件中的双精度扫描到数组中?

苹果

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]

我不知道为什么出现这种情况或如何修理它。

+0

'line'有所有的价值。 – Li357

回答

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

达恩,有同样的确切答案,我正在写:) – Li357

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风格的循环做了准备。它通过执行line.split(" ")创建的双精度数组循环,该数组将空间中的所有值拆分为数组。这造成:

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

然后,您只需通过所有循环,访问values阵列当前迭代或索引,并将其分配给上面的字符串数组中的当前元素的解析双。您可以格式化,并根据需要捕获任何异常。


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 
} 
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' 
}