写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大约是30KB~300KB大小

本文档介绍了一个使用Java编程实现的程序,用于分析30KB至300KB文本文件中的词频,通过正则表达式匹配单词,用TreeMap存储并排序,展示出现频率最高的10个词。同时,文章提到了使用JProfiler进行性能测试,虽然初次接触,但作者期待更多学习交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决步骤

1.读取文件,将读取到的数据放入到字符缓冲区;

2.将各个单词和出现的次数添加到集合中;

3.重写比较器,取出各个单词数进行排序;

4.打印结果;

编程语言:java

测试文本:c:/1.txt     大小:39KB

性能测试工具:JProfiler

具体思路:

1.将读取到的字符存放到StringBuffer中;

2.从StringBuffer中读取单词,利用正则表达式匹配单词,将匹配到的单词和次数添加到TreeMap中;

3.重写比较器,更具出现的次数进行排序,得到出现频率最高的10个词;

程序实现:

package cqupt.first;


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class FileWordsCount {
<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>long time1 = System.currentTimeMillis();
<span style="white-space:pre">		</span>//1.读取到字符
<span style="white-space:pre">		</span>StringBuffer sb = null;
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>// 读取文件
<span style="white-space:pre">			</span>BufferedReader br = new BufferedReader(new FileReader("c:/1.txt"));
<span style="white-space:pre">			</span>// 将读取到的数据放入字符缓冲区
<span style="white-space:pre">			</span>sb = new StringBuffer();
<span style="white-space:pre">			</span>String s;
<span style="white-space:pre">			</span>while ((s = br.readLine()) != null) {
<span style="white-space:pre">				</span>sb.append(s);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>br.close();
<span style="white-space:pre">		</span>} catch (FileNotFoundException e) {
<span style="white-space:pre">			</span>System.out.println("文件未找到!");
<span style="white-space:pre">		</span>} catch (IOException e) {
<span style="white-space:pre">			</span>System.out.println("文件读异常!");
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//2.将各个单词和出现的次数添加到TreeMap中
<span style="white-space:pre">		</span>Pattern pat = Pattern.compile("[a-zA-Z]+");//定义正则表达式匹配单词
<span style="white-space:pre">		</span>String string = sb.toString();
<span style="white-space:pre">		</span>Matcher matcher = pat.matcher(string);
<span style="white-space:pre">		</span>Map<String, Integer> map = new TreeMap<String,Integer>();
<span style="white-space:pre">		</span>String word = "";
<span style="white-space:pre">		</span>int times = 0;
<span style="white-space:pre">		</span>while(matcher.find()){//是否匹配单词
<span style="white-space:pre">			</span>word = matcher.group();//得到一个单词-树映射的键
<span style="white-space:pre">			</span>//对单词进行过滤
<span style="white-space:pre">			</span>if((!word.equals("the")&&!word.equals("is")&&!word.equals("to")&&!word.equals("by")&&!word.equals("a")
<span style="white-space:pre">					</span>&&!word.equals("and")&&!word.equals("was")&&!word.equals("has")&&!word.equals("had")&&!word.equals("I")
<span style="white-space:pre">					</span>&&!word.equals("for")&&!word.equals("my")&&!word.equals("me")&&!word.equals("with")&&!word.equals("of")
<span style="white-space:pre">					</span>&&!word.equals("in")&&!word.equals("on")&&!word.equals("that")&&!word.equals("it")&&!word.equals("The")
<span style="white-space:pre">					</span>&&!word.equals("at")&&!word.equals("which")&&!word.equals("he")&&!word.equals("as")
                                        &&!word.equals("but")&&!word.equals("his")&&!word.equals("from")&&!word.equals("some")&&!word.equals("be")
                                        &&!word.equals("were")&&!word.equals("not") &&!word.equals("they")&&!word.equals("this")&&!word.equals("an")
                                        &&!word.equals("no")&&!word.equals("into")&&!word.equals("It")&&!word.equals("there")&&!word.equals("But")
                                        &&!word.equals("him")&&!word.equals("could")&&!word.equals("been")&&!word.equals("would")&&!word.equals("she")
                                        &&!word.equals("then")&&!word.equals("Then")&&!word.equals("have")&&!word.equals("we")&&!word.equals("t")
                                        &&!word.equals("you")&&!word.equals("can")&&!word.equals("one")&&!word.equals("are")&&!word.equals("all")
                                        &&!word.equals("And")&&!word.equals("your")&&!word.equals("s")&&!word.equals("do")&&!word.equals("out")
                                        &&!word.equals("what")&&!word.equals("about")&&!word.equals("so")&&!word.equals("up")&&!word.equals("re"))
                                        &&!word.equals("So")&&!word.equals("get")&&!word.equals("just")&&!word.equals("who")&&!word.equals("these")
                                        &&!word.equals("if")&&!word.equals("our")){
<span style="white-space:pre">				</span>if(map.containsKey(word)){
<span style="white-space:pre">					</span>times = map.get(word);//得到单词出现的次数
<span style="white-space:pre">					</span>map.put(word, times+1);
<span style="white-space:pre">				</span>}else{
<span style="white-space:pre">					</span>map.put(word, 1);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//3.根据出现次数排序
<span style="white-space:pre">		</span>List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry
<span style="white-space:pre">				</span><String,Integer>>(map.entrySet());
<span style="white-space:pre">		</span>/*
<span style="white-space:pre">		</span> * 重写比较器
<span style="white-space:pre">		</span> * 取出单词个数(value)比较
<span style="white-space:pre">		</span> */
<span style="white-space:pre">		</span>Comparator<Map.Entry<String, Integer>> comparator = 
<span style="white-space:pre">				</span>new Comparator<Map.Entry<String, Integer>>() {
<span style="white-space:pre">		</span>public int compare(Map.Entry<String,Integer> left,Map.Entry<String,Integer> right) {
<span style="white-space:pre">				</span>return (left.getValue()).compareTo(right.getValue());
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>};
<span style="white-space:pre">		</span>Collections.sort(list,comparator);//进行排序
<span style="white-space:pre">		</span>//4.打印
<span style="white-space:pre">		</span>int last = list.size() - 1;
<span style="white-space:pre">		</span>for (int i = last; i > last-10; i--) {
<span style="white-space:pre">			</span>String key = list.get(i).getKey();
<span style="white-space:pre">			</span>Integer value = list.get(i).getValue();
<span style="white-space:pre">			</span>int j = last-i+1;
<span style="white-space:pre">			</span>System.out.println("Top"+j+":");
<span style="white-space:pre">			</span>System.out.println(key+" 次数:"+value);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>long time2 = System.currentTimeMillis();
<span style="white-space:pre">		</span>System.out.println("耗时: ");
<span style="white-space:pre">		</span>System.out.println(time2 - time1+"ms");
<span style="white-space:pre">	</span>}
}


运行结果:

(1)没有进行过滤


(2)进行过滤



性能测试

哪些类发生了变化:


内存使用情况:


GC:


Classes:


CPU Load:


总结:

第一次使用JProfiler,还只是初步了解该软件,性能测试不足之处希望大家多多包涵。以后也还会继续写写类似的博客,希望能与各位大神多多交流,学习进步。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值