簡體   English   中英

查找字符串並顯示行號和行本身?

[英]Find a string and display the line number and the line itself?

我正在設計一個程序,該程序讀取txt文件的大小,包含的單詞,數字和字符的數量,並能夠在文件中搜索給定的字符串。

例如。

txt文件具有

曾經有一塊土地

那片土地不再存在。

那片土地是...

如果我想搜索“土地”,它將列出所有3行。

我創建的用於搜索文件並查找字符串的方法是:

public String searchWord(String key) throws Exception {

    LineNumberReader lnr = new LineNumberReader(new FileReader(f));
    String line = null;
    line = recursiveSearch(lnr.readLine(), key, lnr);

    return line;
}

public String recursiveSearch(String currentLineText, String key, LineNumberReader lnr)
        throws Exception {

    if (currentLineText != null) {
        String lCase = currentLineText.toLowerCase();
        if (lCase.contains(key.toLowerCase())) {

            return ("Line " + lnr.getLineNumber() + ": " + currentLineText
                    + "\n");
        }
    }
    return recursiveSearch(lnr.readLine(), key, lnr);
}

該程序確實確實可以正確搜索文件,因此我必須假定searchWord正常運行。 但是,如果我鍵入“ land”,它將僅返回“曾經有一個land”,而不是全部3行。

如果我鍵入“ longer”,它將正確返回第二行。 您能給我什么方向以顯示所有必需的行?

編輯

我接受了MadProgrammer的建議,我相信他是對的。 需要一個清單。 但是,我重新輸入代碼后

  public List<String> searchWord(String key) throws Exception {

    LineNumberReader lnr = new LineNumberReader(new FileReader(f));

    return recursiveSearch(lnr.readLine(), key, lnr);
 }


 public List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr)
        throws Exception {
     List<String> resultList = new ArrayList<String>();

    if (currentLineText != null) {
        String lCase = currentLineText.toLowerCase();
        if (lCase.contains(key.toLowerCase())) {

            String result = ("Line " + lnr.getLineNumber() + ": " + currentLineText
                    + "\n");
            resultList.add(result);
        }
    }
    String nextLine = lnr.readLine();
    if (nextLine != null) {
        resultList.addAll(recursiveSearch(nextLine, key, lnr));
    }
    return resultList;
}

測試類出現錯誤。 程序未找到“ searchMethod”

  f.selectFile();

  if (f.exists()) {
     try {
         String input = JOptionPane.showInputDialog("Enter a word ");
         for (String line : searchWord(input)) {
              display(line);
         }

我可能需要重寫測試類的一部分,或者尋找更多的Lists示例以更好地理解。

編輯2

因此,我只是在測試類中發送了這兩種方法,並用“靜態”重命名了這兩種方法,一切正常。 我不想這樣做,但是現在我必須讓FileReader通過用戶輸入選擇文件,對我來說應該很容易。 多謝你們。

問題是您的搜索例程只能找到一個單詞。

return ("Line " + lnr.getLineNumber() + ": " + currentLineText + "\n");

將停止任何進一步的執行並返回到調用方,從不尋找任何新結果。 您僅返回String的事實是另一個問題,因為您永遠找不到多個String ,除非您打算連接結果

更好的解決方案是允許該方法返回數組或結果List ,將找到的每個結果添加到List中,然后將從后續校准中找到的所有結果添加到recursiveSearch ,例如...

import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;

public class Test1 {

    public static void main(String[] args) {
        try {
            for (String line : searchWord("land")) {
                System.out.println(line);
            }
        } catch (Exception exp) {
            exp.printStackTrace();
        }
    }

    public static List<String> searchWord(String key) throws Exception {

        LineNumberReader lnr = new LineNumberReader(new FileReader(new File("StuffToRead.txt")));

        return recursiveSearch(lnr.readLine(), key, lnr);
    }

    public static List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr)
                    throws Exception {

        List<String> results = new ArrayList<String>(25);
        if (currentLineText != null) {
            String lCase = currentLineText.toLowerCase();
            if (lCase.contains(key.toLowerCase())) {

                results.add("Line " + lnr.getLineNumber() + ": " + currentLineText);
            }
            results.addAll(recursiveSearch(lnr.readLine(), key, lnr));
        }
        return results;
    }

}

您將從recursiveSearch()方法返回一行。 您應該返回行列表。 然后您的這個問題將得到解決。

就像是 ...

public List<String> recursiveSearch(String currentLineText, String key, LineNumberReader lnr)
        throws Exception {
    List<String> resultList = new ArrayList<String>();
    if (currentLineText != null) {
        String lCase = currentLineText.toLowerCase();
        if (lCase.contains(key.toLowerCase())) {

            String result = "Line " + lnr.getLineNumber() + ": " + currentLineText + "\n";
            resultList.add(result);
        }
    }
    String nextLine = lnr.readLine(); 
    if(nextLine != null) {
         resultList.addALL(recursiveSearch(nextLine, key, lnr));
    }
    return resultList;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM