2017-04-25 6 views
0

Ich versuche, Informationen aus einer externen Datei einzulesen und auf dem Bildschirm verschiedene Statistiken über sie zu drucken. Ich war in der Lage, die Anzahl der Zeilen und Absätze erfolgreich aufzuspüren, geriet jedoch in Schwierigkeiten, die Gesamtanzahl an Wörtern zu finden.Versuchen, die Anzahl der Wörter aus der Eingabedatei zu finden

Ich bemerkte, dass, wenn ich die zweite While-Schleife nehme und es zuerst gebe, gibt es mir die richtige Anzahl von Wörtern, aber die falschen Zeilen und Absätze, aber wenn ich es so wie es jetzt läuft, gibt es mir die richtigen Zeilen und Absätze, aber die falschen Worte.

Ich würde Ihre Hilfe sehr schätzen, herauszufinden, warum das so ist. Vielen Dank!

int x = 0, words = 0, y = 0; 
System.out.print("Name of the input file: "); 
in = kbd.nextLine().toLowerCase(); 
System.out.println(" "); 

// Set up connection to the input file 
Scanner input = new Scanner(new FileReader(in)); 

// Set up connection to an output file 
PrintWriter output = new PrintWriter(new FileOutputStream("datacopy.txt")); 
int lineNum = 0; 

while (input.hasNextLine()) { 

    String line; 
    line = input.nextLine(); 

    if (line.length() == 0) { 
     x++; 
    } 
    output.println(line + "\n"); 
    lineNum++; 

} 
while (input.hasNext()) { 
    String line = input.next(); 
    words++; 
} 

System.out.println("Words: " + words); 
System.out.println("Lines: " + lineNum); 
System.out.println("Paragraphs " + --x); 
System.out.println(" "); 
System.out.println("Output file datacopy.txt created."); 

Antwort

2

Sie müssen Ihre input in jeder Schleife neu initialisieren:

Scanner input = new Scanner(new FileReader(in)); 

//loop1 

input = new Scanner(new FileReader(in));//re-initialize it again 

//loop2 

Da in der zweiten Schleife Ihre Schleife nicht von Anfang an beginnt, beginnt sie am Endpunkt der ersten Schleife.

+1

Es funktionierte. Vielen Dank! – s24569

+0

@ s24569 Diese Lösung funktioniert definitiv, aber sie liest die Datei zweimal durch. Dies verdoppelt den Arbeitsaufwand und macht es für große Dateien sehr ineffizient, besonders wenn sie sich auf entfernten Laufwerken befinden. – dasblinkenlight

1

Das Problem ist, dass beide unter Schleifen erfordern die input am Anfang der Datei positioniert werden:

while (input.hasNextLine()) // count lines 

while(input.hasNext()) // count words 

Obwohl die Datei „Zurückspulen“ und ausgehend vom Anfang möglich ist, ist es nicht optimal. Es ist besser, die Datei Zeile für Zeile zu lesen und Wörter zu zählen, während Sie fortfahren.

Mit dem line Variable aus der while (input.hasNextLine()) Schleife, aufgeteilt in einzelne Worte, und ihre Zahl auf die laufende Summe hinzu:

while (input.hasNextLine()) { 
    String line = input.nextLine(); 
    output.println(line + "\n"); 
    lineNum++; 
    if(line.length() == 0){ 
     x++; 
     continue; 
    } 
    words += line.split("\\s+").length; 
} 
+1

Dies ist eine effizientere Art der Verarbeitung der Eingabedatei – WOUNDEDStevenJones

Verwandte Themen