我正在设计一个程序来读取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按用户输入选择文件,对我来说应该很容易。谢谢你们。
答案 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;
}