2016-01-21 117 views
-5

我想計算某個字符串出現在文本文件(.txt)中的次數,到目前爲止,我得到FileReader的工作(它讀取文件,並且我可以將文件中的文本輸出到控制檯)。我想要知道的是檢查一個字符串(由用戶輸入)是否存在於文本文件中。我到目前爲止是這樣的:(?)計算字符串出現在文件中的次數

import java.io.*; 
import java.util.Scanner; 

public class Assignment2 { 

    String fileName = "test.txt"; 
    String line = null; 
    int counter = 0; 

    public String getUserInput() { 
     String userInput; 
     Scanner userInputScanner = new Scanner(System.in); 
     userInput = userInputScanner.nextLine(); 
     return userInput; 
    } 

    public String returnUserInput() { 
     String userInput = getUserInput(); 
     return userInput; 
    } 


    public void readFile() {   
     try { 

      FileReader fileReader = new FileReader(fileName); 
      BufferedReader bufferedReader = new BufferedReader(fileReader); 

      while((line = bufferedReader.readLine()) != null) { 
       while (line.indexOf(word, indexOfWord) != -1) { 
        indexOfWord += word.length(); 
        counter += 1; 
       } 
      } 
      bufferedReader.close(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     Assignment2 test = new Assignment2(); 
     test.readFile(); 
    } 

} 

請告訴我發生的事情是,我可以通過文件不循環,當我在for循環中運行的程序,它被卡住,它只是不斷運行沒有錯誤,但它什麼都不做。我知道我的問題是與for循環(line.length()將無法正常工作,因爲緩衝讀取器一次讀取一行...我真正想要的是獲取字符串的數量文件)。我在檢查用戶輸入時也遇到了麻煩(我想忽略這些字母的大小寫,但是我不能用.contains()來做到這一點,並且我不能想到另一種方法來檢查該行是否包含用戶輸入) 。

另外,我的過程是正確的,還是我這樣做效率不高?我必須檢查一個3000字的文件。

+3

什麼是你的問題?問題是什麼?請修改您的問題以包含確切的錯誤和確切的預期行爲。 –

+0

聽起來像是一個家庭作業問題。你不應該直接在這裏提出這樣的問題。如果只有3000個字,您可以簡單地將整個文件讀入內存並連接行(StringBuilder),然後使用for循環計算出現次數。 –

+0

如果您正在尋找其他方法,您可以搜索其他關於[計算文件中特定字符串的出現次數]的問題(http://stackoverflow.com/questions/9689860/counting-the-occurence-of -a-特定字符串-IN-A-文件)。 – azurefrog

回答

1

您的程序沒有「卡住」,它正在等待您輸入「用戶輸入」(再次)。

您一直在迴路內呼叫returnUserInput(),它會呼叫getUserInput(),它將等待您鍵入(另一個)字符串並按Enter鍵。


至於你的代碼,不聲明line作爲一個字段。它應該是一個局部變量。

要重複搜索一行文本,請不要使用或該行的每個字符的循環。使用indexOf(String str, int fromIndex)

更新

的代碼應該是這樣的:

String word = returnUserInput(); 
this.counter = 0; 
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { 
    for (String line; (line = reader.readLine()) != null;) { 
     for (int i = 0; (i = line.indexOf(word, i)) != -1; i += word.length()) { 
      this.counter++; 
     } 
    } 
} 
+0

所以行應該在readFile函數中聲明?而對於使用indexOf,只是在第一次找到字符串時返回。有沒有辦法重複它,每次它返回一個索引,我可以增加一個計數器? –

+0

@MahmudAssamaray是的,裏面的方法。 ---你用'fromIndex'繼續調用'indexOf()'等於前一次調用的返回值加上搜索字符串的長度。在第一次調用時,'fromIndex'應該是'0'。 – Andreas

+0

我幾乎可以正常工作......但由於某些原因,當我輸入文件中存在的單詞時,它返回的數字大於出現次數。這是我添加的代碼while(line.indexOf(word,indexOfWord)!= -1)\t \t \t \t indexOfWord + = word.length(); \t \t \t \t \t counter + = 1; \t \t \t \t}'我還會更新我的問題以顯示新代碼,以便讀取 –

0

如果你想忽略的情況下使用以下方法:

line.toLowerCase().contains(text.toLowerCase()) 

行是從文件中讀取行。
文本是輸入字符串的用戶,這是你正在尋找的。
定義一個計數器變量來跟蹤數字。

之後檢查是否找到了匹配,如果是的話就遞增計數器。 我可以給你確切的代碼,但你不會學習。如果你卡住了,這不起作用,我可以進一步幫助你。

相關問題