2016-05-24 3 views
2

Ich möchte alle Textdateien im Ordner lesen und bestimmte Wörter in jeder Datei zählen und dann die Häufigkeit der Wörter in eine TXT-Datei schreiben. Hier ist mein Code:Java: Zähle die Häufigkeit bestimmter Wörter und schreibe in die Datei

public static void main(String[] args) throws IOException{ 

    String[] array = new String[]{"beautiful", "good", "extraordinary", "wonderful", "like", 
      "proud","brilliant","great","well", "perfect"}; 
    int[] wordCount = new int[]{0,0,0,0,0,0,0,0,0,0}; 

    File path = new File("development/text"); 

    for(File file: path.listFiles()){ 

     PrintWriter writer = new PrintWriter(new FileWriter("result.txt",true));    
     FileInputStream fin = new FileInputStream(file); 
     Scanner s = new Scanner(fin); 

     for(int i = 0; i < array.length; i++) 
     { 
         wordCounter = 0; 
         while (s.hasNext()) 
         { 
          if (s.next().equals(array[i])) { 
           wordCount[i]++; 
          } 
         }       
     } 

     writer.println(wordCount[0] + "," + wordCount[1] + "," + wordCount[2] + "," + 
       wordCount[3] + "," + wordCount[4] + "," +wordCount[5] + "," +wordCount[6] 
       + "," +wordCount[7] + "," + wordCount[8] + "," + wordCount[9]); 
     fin.close(); 
     s.close(); 
     writer.close(); 
    } 
} 

Allerdings liest mein Code nur das erste Element der Array (schön). Andere Ausgabeelemente sind 0, obwohl sie in einer Textdatei vorkommen.

Antwort

1

Kehren Sie die Reihenfolge Ihrer Schleifen um. Statt "für jedes Wort im Array zu lesen, lesen Sie die Datei Wort für Wort und prüfen Sie, ob es für jedes Wort in der Datei eine Übereinstimmung gibt", die Sie benötigen ", überprüfen Sie sie für jedes Wort im Array".

Das Problem mit Ihrer aktuellen Implementierung ist, dass die Datei nicht "zurückgespult" wird. Sobald das Ende der Datei beim ersten Wort erreicht ist, gibt es kein Zurück mehr und beginnt von Anfang an. Jedoch ist es vom Anfang der Datei beginnt, ist sehr viel teurer als die von dem Anfang eines Arrays ausgehend, so um Schleife invertierender ist die optimale Lösung:

while (s.hasNext()) { 
    String word = s.next(); 
    for(int i = 0; i < array.length; i++) { 
     if (word.equals(array[i])) { 
      wordCount[i]++; 
     } 
    } 
} 
0

Bewegen Sie die Linie Scanner s = new Scanner(fin); oben while (s.hasNext())

OR

tatsächlich als dasblinkenlight gesagt, Sie Reihenfolge der Schleife umkehren sollen, auch fand ich einige Probleme mit Ihrem Code: a) Die Printwriter sollten über die Listfiles Schleife b) Die fin.close() s wirklich sein. schließen() .... alle sho Seid außerhalb der Hauptschleife.

Mit den oben genannten Änderungen wird der Code so etwas wie:

PrintWriter writer = new PrintWriter(new FileWriter("result.txt",true)); 
for(File file: path.listFiles()) 
{ 


     FileInputStream fin = new FileInputStream(file); 
     Scanner s = new Scanner(fin); 

     while (s.hasNext()) 
     { 
      if (Arrays.asList(array).contains(s.next())) 
      { 
       wordCount[i]++; 
      } 

     } 


} 

writer.println(wordCount[0] + "," + wordCount[1] + "," + wordCount[2] + "," + 
       wordCount[3] + "," + wordCount[4] + "," +wordCount[5] + "," +wordCount[6] 
       + "," +wordCount[7] + "," + wordCount[8] + "," + wordCount[9]); 
     fin.close(); 
     s.close(); 
     writer.close(); 
0

Sie die gesamte Datei gelesen haben, die Ereignisse des ersten Wortes zu zählen, „schön“. Wenn Sie anfangen, das zweite Wort zu zählen, ist Ihr Scanner s bereits am Ende der Datei, so dass Sie nichts zurückgibt.

Verwandte Themen