计算字符串在文件中出现的次数
Count number of times string appears in a file
我正在尝试计算某个字符串在文本文件 (.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() 不起作用,因为缓冲的 reader 一次读取一行...我真正想要的是获取文件中的字符串数)。我在检查用户输入时也遇到了问题(我想忽略字母的大小写,但我不能用 .contains() 做到这一点,而且我想不出另一种方法来检查该行是否包含用户输入) .
此外,我的流程是否正确,或者我这样做的方式效率不高?我得查一个3000字的文档。
如果您想忽略大小写,请使用以下方法:
line.toLowerCase().contains(text.toLowerCase())
line 是您从文件中读取的行。
text 是用户输入的字符串,这就是您要查找的内容。
定义一个计数器变量来跟踪数字。
然后检查是否找到匹配项,如果找到则增加计数器。
我可以给你确切的代码,但那样你就学不会了。如果您遇到困难并且这不起作用,我可以进一步帮助您。
你的程序不是"stuck",它正在等待你进入"user input"(再次)。
你一直在循环中调用 returnUserInput()
,它会调用 getUserInput()
,它将等待你输入(另一个)字符串并按 Enter。
至于您的代码,请不要将 line
声明为字段。应该是局部变量。
要重复搜索一行中的文本,请不要使用 contains()
或循环搜索该行的每个字符。使用 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++;
}
}
}
我正在尝试计算某个字符串在文本文件 (.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() 不起作用,因为缓冲的 reader 一次读取一行...我真正想要的是获取文件中的字符串数)。我在检查用户输入时也遇到了问题(我想忽略字母的大小写,但我不能用 .contains() 做到这一点,而且我想不出另一种方法来检查该行是否包含用户输入) .
此外,我的流程是否正确,或者我这样做的方式效率不高?我得查一个3000字的文档。
如果您想忽略大小写,请使用以下方法:
line.toLowerCase().contains(text.toLowerCase())
line 是您从文件中读取的行。
text 是用户输入的字符串,这就是您要查找的内容。
定义一个计数器变量来跟踪数字。
然后检查是否找到匹配项,如果找到则增加计数器。 我可以给你确切的代码,但那样你就学不会了。如果您遇到困难并且这不起作用,我可以进一步帮助您。
你的程序不是"stuck",它正在等待你进入"user input"(再次)。
你一直在循环中调用 returnUserInput()
,它会调用 getUserInput()
,它将等待你输入(另一个)字符串并按 Enter。
至于您的代码,请不要将 line
声明为字段。应该是局部变量。
要重复搜索一行中的文本,请不要使用 contains()
或循环搜索该行的每个字符。使用 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++;
}
}
}