Collections工具类中的frequency方法统计单词出现的次数

最近发现了一个Collections中有一个很好用的方法:frequency,主要是用来统计单词出现的次数,有了这个方法后,我们又可以少写很多代码了。

 

下面是方法的用途:(一个简单的实例能说明一下)

 

String strs = "zhangsan zhangsanfeng lisi lisi wangwu wangwuliu zhangwuji zhou zhouzhinuo";
		System.out.println(strs);
		List<String> tempList = Arrays.asList(strs.split(" "));
		for(String stemp:tempList){
			System.out.println(stemp+" ->出现次数:"+Collections.frequency(tempList, stemp));
		}

 

 

输出结果如下:

zhangsan zhangsanfeng lisi lisi wangwu wangwuliu zhangwuji zhou zhouzhinuo
zhangsan ->出现次数:1
zhangsanfeng ->出现次数:1
lisi ->出现次数:2
lisi ->出现次数:2
wangwu ->出现次数:1
wangwuliu ->出现次数:1
zhangwuji ->出现次数:1
zhou ->出现次数:1
zhouzhinuo ->出现次数:1

 

好的,让我来解答你的问题。 首先,我们需要读取四级常用单词.txt文档的内容。由于该文档的编码方式为UTF-8,我们可以使用Java的InputStreamReader类来读取。代码如下: ```java File file = new File("四级常用单词.txt"); // 创建File对象 InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8"); // 创建InputStreamReader对象 ``` 接着,我们需要统计文档每个英文字母出现次数和频率。我们可以使用一个长度为26的int数组来存储每个字母出现次数,使用一个整型变量来记录文档总共出现的英文字母数。统计过程,我们可以一次读入一个字符,判断该字符是否为英文字母,如果是则将该字母对应的数组元素加一,同时将总数加一。代码如下: ```java int[] count = new int[26]; // 存储每个字母出现次数 int total = 0; // 总共出现的英文字母数 int c = 0; // 读入的字符 while ((c = isr.read()) != -1) { // 读取文档的每个字符 if (c >= 'a' && c <= 'z') { // 判断是否为小写字母 count[c - 'a']++; // 将对应的数组元素加一 total++; // 将总数加一 } else if (c >= 'A' && c <= 'Z') { // 判断是否为大写字母 count[c - 'A']++; // 将对应的数组元素加一 total++; // 将总数加一 } } isr.close(); // 关闭InputStreamReader ``` 最后,我们需要将统计结果按照字母出现频率由高到低排序后输出到目标文件“result.txt”。我们可以使用一个长度为26的Map来存储每个字母及其出现次数,然后使用JavaCollections工具类对Map进行排序,最后按照要求输出到文件。代码如下: ```java Map<Character, Integer> map = new HashMap<Character, Integer>(); // 存储每个字母及其出现次数 for (int i = 0; i < 26; i++) { map.put((char)('a' + i), count[i]); // 将字母及其出现次数存入Map } List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet()); // 将Map转换为List Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { // 对List进行排序 public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { return o2.getValue() - o1.getValue(); // 按照出现次数由高到低排序 } }); FileWriter fw = new FileWriter("result.txt"); // 创建FileWriter对象 for (Map.Entry<Character, Integer> entry : list) { // 遍历List double frequency = (double)entry.getValue() / total * 100; // 计算出现频率 fw.write(entry.getKey() + " " + entry.getValue() + " " + String.format("%.2f", frequency) + "%\n"); // 输出到文件 } fw.close(); // 关闭FileWriter ``` 完整代码如下: ```java import java.io.*; import java.util.*; public class CountLetters { public static void main(String[] args) throws IOException { File file = new File("四级常用单词.txt"); // 创建File对象 InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8"); // 创建InputStreamReader对象 int[] count = new int[26]; // 存储每个字母出现次数 int total = 0; // 总共出现的英文字母数 int c = 0; // 读入的字符 while ((c = isr.read()) != -1) { // 读取文档的每个字符 if (c >= 'a' && c <= 'z') { // 判断是否为小写字母 count[c - 'a']++; // 将对应的数组元素加一 total++; // 将总数加一 } else if (c >= 'A' && c <= 'Z') { // 判断是否为大写字母 count[c - 'A']++; // 将对应的数组元素加一 total++; // 将总数加一 } } isr.close(); // 关闭InputStreamReader Map<Character, Integer> map = new HashMap<Character, Integer>(); // 存储每个字母及其出现次数 for (int i = 0; i < 26; i++) { map.put((char)('a' + i), count[i]); // 将字母及其出现次数存入Map } List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet()); // 将Map转换为List Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { // 对List进行排序 public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { return o2.getValue() - o1.getValue(); // 按照出现次数由高到低排序 } }); FileWriter fw = new FileWriter("result.txt"); // 创建FileWriter对象 for (Map.Entry<Character, Integer> entry : list) { // 遍历List double frequency = (double)entry.getValue() / total * 100; // 计算出现频率 fw.write(entry.getKey() + " " + entry.getValue() + " " + String.format("%.2f", frequency) + "%\n"); // 输出到文件 } fw.close(); // 关闭FileWriter } } ``` 希望我的回答能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值