2016-09-25 52 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' 
}