如题,这个题目是学了IO流以后老师出的,那么肯定是要用到IO流的知识来解决了。
这相当于一个词频统计问题,操作的肯定是纯文本文件,那么我们肯定是首选字符文件输入流(FileReader)来读取了。
思路也很简单,假设文件中有这样一串文本内容:
ahello world 中国 java hel lo 中国 hello
我们查找单词hello
在其中出现的次数,按照我的逻辑,我认为hello出现了2次的,ahello也算。
利用程序如何做呢?
首先,要查找的字符串是’hello’,它的长度为5,那么我们就创建一个长度为5的字符数组,每次读取5个字符,把读取出来的字符,构建成字符串,利用这个字符串和hello比较,如果相等,则认为该单词出现了一次,count++ .
很显然,这不能统计出hello出现的次数,达不到预期的效果。
我们要统计hello出现的次数,很显然hello不一定是每隔5个字符出现一次,helle的前面,有可能还有一些字符,就比如上面的ahello
,我们要想统计出一段文本中hello出现的次数,可能就需要采用穷举法,把文本中每5个相邻的字符读出来,判断是否相等,当然,已经比较过的,就不能再读出来比较。
我们可以这样实现:基于上面的思路,我读取5遍文本(“hello”.length()=5),第一遍,跳过0个字节读,第二遍,跳过1个字符读,第三遍,跳过2个字符读,依次类推,第五遍,就跳过4个字符去读,每次还是读5个字符,构建成字符串,利用equals判断。这样可以保证把文本中所有的相邻的5个字符拿出来构建成字符串跟hello比较,并且绝对不会重复!有了这个思路,代码实现就简单了。
代码实现:
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;
public class WordFrequencyCount {
public static void main(String[] args) {
int count = WordFrequencyCount.test();
System.out.println(count);
}
public static int test() {
Scanner input = new Scanner(System.in);
System.out.println("请输入文件路径:");
String filePath = input.nextLine();
System.out.println("请输入要统计的字符串:");
String msg = input.nextLine();
// String msg = "hello";
Reader in = null;
int count = 0;
try {
for(int i = 0;i<msg.length();i++) {
//E:\\test\\que.txt
in = new FileReader(filePath);
char[] chars = new char[msg.length()];
in.skip(i);
int len = -1;
while((len = in.read(chars))!=-1) {
String newStr = new String(chars,0,len);
if(newStr.equals(msg)) {
count++;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return count;
}
}
第二种实现思路:
利用BufferedReader中的readLine()方法,每次读取一行,判断这一行中有多少个字符串是hello。它只需要读一遍,就可以统计出一段文本中字符串出现的频率,性能快,思路也很简单。
代码实现:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int count = Demo.test();
System.out.println(count);
}
public static int test() {
Scanner input = new Scanner(System.in);
System.out.println("请输入文件路径:");
String filePath = input.nextLine();
System.out.println("请输入要统计的字符串:");
String msg = input.nextLine();
// String msg = "hello";
FileReader in = null;
BufferedReader reader = null;
int count = 0;
try {
// E:\\test\\que.txt
in = new FileReader(filePath);
reader = new BufferedReader(in);
// 利用BufferedReader读取一行,如果读到文件末尾,返回null
String line = null;
while ((line = reader.readLine()) != null) {
// 给一个字符串,给一个子串,判断这个子串在字符串中出现了几次
count += (line.length() - line.replace(msg, "").length())/msg.length();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return count;
}
}