找到一个字符串并显示行号和行本身?

时间:2014-10-21 00:14:57

标签: java file recursion

我正在设计一个程序来读取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正常工作。但是,如果我输入“土地”,它只会返回“曾经有一块土地”,而不是全部三条线。

如果我输入“更长”,它将正确返回第二行。你能告诉我哪些指示显示所有必需的行?

修改

我接受了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);
         }

我可能需要重写测试类的一部分,或者寻找更多的列表示例以便更好地理解。

编辑2

所以我只是在我的测试类中发送了两个方法并用“静态”重命名它们 一切正常。我不喜欢这样做,但现在我只需让FileReader按用户输入选择文件,对我来说应该很容易。谢谢你们。

2 个答案:

答案 0 :(得分:0)

问题是你的搜索程序只能找到一个单词......

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

将停止任何进一步执行并返回给调用者,从不寻找任何新结果。您只返回String这一事实是另一个问题,因为除非您打算连接结果,否则永远找不到多个String

更好的解决方案是允许方法返回一个数组或List个结果,将每个结果添加到找到的List中,然后将从后续calss中找到的所有结果添加到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;
    }

}

答案 1 :(得分:0)

您正在从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;
}