java 按照单词频率输出_读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。...

本文介绍了一个使用Java读取文档并统计每个单词出现频率的程序。通过HashMap存储单词和频率,然后转换为List并使用自定义Comparator按频率排序,展示频率最高的十个单词。程序包括文件读取、单词收集、频率统计、排序和输出。

首先是第一次接触博客园,感觉这是一个非常棒的交流平台,不管是菜鸟还是老手都可以在这学习到很多。

首先看到这个题目。首先我对这个题目进行了分析,此过程大概持续了1天时间,最后我确定用Java来完成。

然后就是设计阶段:本程序利用HashMap先存储读取的单词,并且记录出现频率。然后倒入到List中,通过自定义的Comparator来通过频率高低排序,显示前十个。

然后进入编码阶段:此过程持续1天。

最后需要对自己编写的程序进行测试以及修改,发现不好的地方改进。

下面是对此程序每个阶段的具体分析:

一:此段程序是文件读取

File file = newFile(path);

FileInputStream fis= newFileInputStream(file);

InputStreamReader isr= new InputStreamReader(fis);

二:此段程序是先声明一个StringBuffer对象,通过读取的字符来组成单词,当遇到

不是字母的时候得判断单词放入到一个HashMap中

intthechar;

StringBuffer word= newStringBuffer();

HashMap wordList = new HashMap();while ((thechar = isr.read()) != -1) {char letter = (char) thechar;if ((letter >= 'a' && letter <= 'z')|| (letter >= 'A' && letter <= 'Z')) {

word.append(letter);

}else if (word.length() != 0) {

String theword= newString(word);if(wordList.containsKey(theword)) {

wordList.put(theword, wordList.get(theword)+ 1);

}else{

wordList.put(theword,1);

}

word.delete(0, word.length());

}

}

isr.close();

三:将HashMap中的数据放到list中,利用Collections类提供的sort方法,根据自定义的Comparator来按照单词出现的频率从高到低显示,

此处利用Map对象的原理,将Map对象中的键值对组(Map.Entry)调出来排序

List> words = new ArrayList>(

wordList.entrySet());

Collections.sort(words,new Comparator>() {

@Overridepublic int compare(Entryo1,

Entryo2) {//按照出现频率排序由高到低

return - (o1.getValue() -o2.getValue());//按照字母顺序排序//return (o1.getKey()).toString().compareTo(o2.getKey());

}

});

四:下面是完整程序

importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;public classReadingTest {private static String path = "a.txt";public static void main(String[] args) throwsIOException {

File file= newFile(path);

FileInputStream fis= newFileInputStream(file);

InputStreamReader isr= newInputStreamReader(fis);//BufferedReader br = new BufferedReader(isr);//String data = null;

intthechar;

StringBuffer word= newStringBuffer();

HashMap wordList = new HashMap();while ((thechar = isr.read()) != -1) {char letter = (char) thechar;if ((letter >= 'a' && letter <= 'z')|| (letter >= 'A' && letter <= 'Z')) {

word.append(letter);

}else if (word.length() != 0) {

String theword= newString(word);if(wordList.containsKey(theword)) {

wordList.put(theword, wordList.get(theword)+ 1);

}else{

wordList.put(theword,1);

}

word.delete(0, word.length());

}

}

isr.close();//br.close();

System.out.println("排序前:");for(String key : wordList.keySet()) {

System.out.println(key+ " : " +wordList.get(key));

}

System.out.println("排序后:");int i = 0;for (Map.Entrynode : words) {if(i<10){

System.out.println(node.getKey()+ " : " +node.getValue());

}else{break;

}

i++;

}

}

}

完成一次实验需要对实验进行分析,设计,编码,测试等多个步骤,每一步都不可缺少,这样才能保证实验的完整性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值