2016-05-24 9 views
2

フォルダ内のすべてのテキストファイルを読み込み、各ファイルの特定の単語を数え、単語の頻度をtxtファイルに書きたい。ここに私のコードです:Java:特定の単語の頻度をカウントしてファイルに書き込む

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(); 
    } 
} 

しかし、私のコードは、配列(美しい)の最初の要素を読み取るだけです。他の要素の出力はテキストファイルにもかかわらず0です。

答えて

1

ループの順序を逆転させます。配列内の各単語について「行くのではなく、単語ごとにファイルを読んで、ファイル内の各単語に対して「必要」があるかどうかを確認し、配列内の各単語に対してチェックしてください。

現在の実装の問題は、ファイルを「巻き戻し」しないことです。最初の単語にファイルの終わりに達すると、ファイルには戻りません。先頭から始まります。ただし、ファイルの先頭から出発し、配列の先頭からより多くのより高価であるため、ループの順序を逆にすることは、最適なソリューションです。

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

Scanner s = new Scanner(fin);

while (s.hasNext())上またはラインを移動します

実際dasblinkenlightが語ったように、あなたはループの順序を逆にする必要があり、また、私はあなたのコードで問題のカップルが見つかりました: A)のPrintWriterは本当にあなたのLISTFILESループ B)fin.close()、Sを超えるべきです。閉じる()....すべてのショーuldはメインforループの外側にあります。あなたは、「美しい」の最初の単語の出現をカウント、ファイル全体を読んだ

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

:何かのようなコードがされる上記の変更により

。 2番目の単語のカウントを開始すると、Scanner sは既にファイルの最後にあるので、何も返しません。

関連する問題