[英]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.