写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数

如题,这个题目是学了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;
	}
}
    原文作者:发光吖
    原文地址: https://blog.csdn.net/qq_43598138/article/details/108108148
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞