2016-09-25 2 views
0

Ich habe eine Textdatei, die wie folgt aussieht:Wie scannt Doppel aus einer Textdatei in ein Array?

Apple-

10,1 20 11 21,3 31 12,7 22 32,4 42 13

Die erste Zeile ist der Name der Firma, die zweite Zeile repräsentiert seine Aktienkurse.

Ich möchte alle Doppel in ein Array scannen, damit ich Berechnungen durchführen kann.

Hier ist mein Code

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

ich die Datei auswählen, dann überspringen ich die erste Zeile (die den Firmennamen enthält).

Dann initialisiere ich eine Nummer, um die Indezes im Array zu verfolgen. Wenn die Zeile ein anderes double hat, dann wird sie dem Array mit dem Index 'num' hinzugefügt und 'num' wird um 1 erhöht. Dies sollte so lange fortgesetzt werden, bis keine Doppelgänger mehr vorhanden sind.

Zumindest ist das die Logik dahinter. aber der Ausgang kommt immer darauf

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

Ich bin nicht sicher, warum dies geschieht oder wie man repariere es.

+0

'line' hat alle Werte. – Li357

Antwort

0

Ich denke, dass linReader.nextDouble() ist für eine doppelte nach die zuvor gelesene Zeile suchen.

Versuchen Sie, einen Anruf zu nextLine() zu entfernen. Wenn dies nicht hilft, diesen Algorithmus zu verwenden:

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

Darn, hatte die gleiche genaue Antwort, die ich schrieb :) – Li357

0

Erklärung

Der Grund ist, weil Sie nicht die doppelte Linie verwendet wird, und hat dann die doppelte Array Standardwerte, die 0,0 sind. Die Zeile:

String line = linReader.nextLine(); 

ist Teil des Problems. Wenn Sie die folgenden Zeilen zu tun:

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

Die erste Zeile (lineReader.nextLine), wo Sie die Firma Linie zu überspringen hoffen, liest es Apple. Das ist alles in Ordnung, aber wenn Sie das tun,

Dies wird die Zeile der Doppelgänger lesen. Dann wird Ihre if nie ausgeführt, weil es keine Dinge mehr in der Datei zu lesen gibt, so dass die Werte des Double-Arrays nicht anders als die Standardwerte zugewiesen sind.Drucken line werden Sie sehen:

10.1 20 11 21.3 31 12.7 22 32.4 42 13 

Sie können dies dann tun:

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

Statt der if Aussage. Es wird dann korrekt ausgegeben:

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

Der Code oben verwendet eine traditionelle C-style for-Schleife. Es führt eine Schleife durch das Doubling-Array durch, indem line.split(" ") erstellt wird, das alle Werte im Space in ein Array aufteilt. Das schafft:

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

Als nächst Sie nur eine Schleife durch alle, rufen Sie die values Array mit der aktuellen Iteration oder Index und ordnet sie in einer zerlegte Doppel des aktuellen Elements in dem obigen String-Array. Sie können Ausnahmen formatieren und bei Bedarf abfangen.


TL; DR

Hier ist der endgültige Code in der while-Schleife:

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

Vielleicht können Sie Ihren Code wie folgt ändern:

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