本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能。

功能:

  1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计;

  2.支持命令行输入英文作品的文件名;

  3.支持命令行输入存储有英文作品文件的目录名,批量统计;

  4.从控制台读入英文单篇作品,重定向输入流。

实现:

  1.判断输入方式,如果从命令行传递参数则直接对文件进行统计;如果未传递参数,其方式同控制台相同,由用户从标准输入流输入到文件,再对文件进行词频统计。这里如果传入文件路径时会对其是否是文件夹进行判断,如果是文件夹,则对其目录中的文件进行统计。

 if (args.length == 0) {
Scanner in = new Scanner(System.in);
FileWriter out = new FileWriter("Content.txt"); System.out.println("请输入内容,最后以Q结束:"); while (in.hasNext()) {
out.write(in.nextLine()+"\r\n");
}
out.close();
in.close(); new FileProccessing("Content.txt");
}
for (int i = 0; i < args.length; i++) {
String FileName = args[i];
File fs = new File(FileName);
if (fs.isDirectory()) {
File[] filelist = fs.listFiles();
for (int n = 0; n < filelist.length; n++) {
new FileProccessing(filelist[n].getAbsolutePath());
} } else {
new FileProccessing(FileName);
}
}

  2.对ByValueComparator类做了修改,使其能够按词频降序排列的同时,对同频率的单词进行升序排列。

 public class ByValueComparator implements Comparator<Entry<String,Integer>> {
Map<String, Integer> hashmap;
public ByValueComparator(Map<String, Integer> hm) {
this.hashmap = hm;
} @Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
// TODO Auto-generated method stub if (o1.getValue().compareTo(o2.getValue()) == -1) {
return 1;
} else if (o1.getValue().compareTo(o2.getValue()) == 0) {
return o1.getKey().compareTo(o2.getKey());  //单次出现频率相同时,对单词进行升序排列
} else {
return -1;
}
}
}

  3.与上一次相比,为了方便调用,将对文件进行统计操作的代码归入新的类FileProccessing。同时将readline()改为read(char[] c),解决了当一行字符过多时报错的问题。当进行统计的文件过大时,原本输出到屏幕会自动改为输出到文件中,避免了因输出而占用了大部分时间,同时方便用户查阅(默认输出到工程目录下)。

  其中有个小细节:程序中char数组默认大小为64,当读到最后一块时,字符不足64个时,多余未读入字符的数组元素默认为'\0',拆分之后输出结果中会多出一项“    ——1”。因此,在StringTokenizer方法中要录入"\0"作为分隔字符。

  读入文件并进行统计,结果存入到hashmap中:

         int i = 0;
char[] c = new char[64];
String thelast = "";
String wordpart = "";
while ((i = br.read(c)) > 0) {
wordpart = ""; int m = i - 1;
while (Character.isLetter(c[m])) {
wordpart = String.valueOf(c[m]) + wordpart;
c[m] = ' ';
m--;
}
String s = thelast + String.valueOf(c);
StringTokenizer st = new StringTokenizer(s, " ,.!?\"\';:0123456789\n\r\t“”‘’·——-=*/()[]{}…()【】{}\0"); // 用于切分字符串 while (st.hasMoreTokens()) {
String word = st.nextToken();
if (hm.get(word) != null) {
int value = ((Integer) hm.get(word)).intValue();
value++;
hm.put(word, new Integer(value));
} else {
hm.put(word, new Integer(1));
}
}
thelast = wordpart;
}
if (!wordpart.isEmpty()) {
if (hm.get(wordpart) != null) {
int value = ((Integer) hm.get(wordpart)).intValue();
value++;
hm.put(wordpart, new Integer(value));
} else {
hm.put(wordpart, new Integer(1));
}
}

  判断输出内容多少,自动匹配标准输出还是文件输出。其中运用了正则替换,用来打印当前文件名。同时还对总单词量及词汇量进行了统计:

         int NumofWord = 0;
Iterator iter = hm.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
NumofWord += (Integer) entry.getValue();
}
String reg = ".*\\\\(.*)";
String name = filename.replaceAll(reg, "$1");
if (hm.size() > 100) { FileWriter result = new FileWriter("Result.txt", true); result.write("~~~~~~~~~~~~~~~~~~~~\r\n");
result.write(name.substring(0, name.lastIndexOf(".")) + "\r\n");
result.write("number of the words:" + NumofWord + "\r\n");
result.write("totals:" + hm.size() + "\r\n");
for (Map.Entry<String, Integer> str : ll) {
result.write(str.getKey() + "——" + str.getValue() + "\r\n");
} result.write("~~~~~~~~~~~~~~~~~~~~\r\n"); System.out.println("由于" + name.substring(0, name.lastIndexOf(".")) + "文件过大,输出到文件Result中。");
result.close();
} else {
System.out.println("~~~~~~~~~~~~~~~~~~~~");
System.out.println(name.substring(0, name.lastIndexOf(".")));
System.out.println("number of the words:" + NumofWord);
System.out.println("totals:" + hm.size());
for (Map.Entry<String, Integer> str : ll) {
System.out.println(str.getKey() + "——" + str.getValue());
} System.out.println("~~~~~~~~~~~~~~~~~~~~");
}

运行结果:

  1.命令行标准输入界面:

  

  2.执行结果:

  

  3.控制台界面:

  

  4.命令行传入文件:

  

  5.同时传入大文件及文件夹:

  

  

  6.重定向输入:

  

  

代码地址:

  HTTPS   https://coding.net/u/regretless/p/WordFrequencyCount/git

  SSH      git@git.coding.net:regretless/WordFrequencyCount.git

  GIT       git://git.coding.net/regretless/WordFrequencyCount.git

Java实现的词频统计——功能改进的更多相关文章

  1. 【第二周】Java实现英语文章词频统计(改进1)

    本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...

  2. Java实现的词频统计——Web迁移

    本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...

  3. Java实现中文词频统计

    昨日有个中文词频统计的需求, 百度一番后, 发现一大堆标题党文章, 讲的与内容严重不符, 这里就简单记录下自己实现的流程吧! 与英文单词的词频统计不同, 中文的难点在于如何分词, 不过好在有许多优秀的 ...

  4. Java实现的词频统计——单元测试

    前言:本次测试过程中发现了几个未知字符,这里将其转化为十六进制码对其加以区分. 1)保存统计结果的Result文件中显示如图: 2)将其复制到eclipse环境下的切分方法StringTokenize ...

  5. Java实现的词频统计

    要求: 1.读取文件: 2.记录出现的词汇及出现频率: 3.按照频率降序排列: 4.输出结果. 概要: 1.读取的文件路径是默认的,为了方便调试,将要统计的文章.段落复制到文本中即可:2.只支持英文: ...

  6. MapReduce 入门之一步步自实现词频统计功能

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7687120.html ------------------------------------ ...

  7. awk词频统计功能

    [root@test88 ~]# vim word_freq.sh #!/bin/bash if [ $# -ne 1 ];then echo "Usage: $0 filename&quo ...

  8. 如何用java完成一个中文词频统计程序

    要想完成一个中文词频统计功能,首先必须使用一个中文分词器,这里使用的是中科院的.下载地址是http://ictclas.nlpir.org/downloads,由于本人电脑系统是win32位的,因此下 ...

  9. 使用HDFS完成wordcount词频统计

    任务需求 统计HDFS上文件的wordcount,并将统计结果输出到HDFS 功能拆解 读取HDFS文件 业务处理(词频统计) 缓存处理结果 将结果输出到HDFS 数据准备 事先往HDFS上传需要进行 ...

随机推荐

  1. ubuntu软件安装

    介绍常用的ubuntu软件及其安装 首先声明,本人在以下的操作全部基于腾讯云16.04版本ubuntu,若版本不一,有些出入,遇到问题可以在楼下留言. ubuntu中文官网 汉化终端 下载中文包 su ...

  2. 【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪

    这道题的写法大体有两种:大法师DFS和并查集,两种算法都不难,本篇博客主要讲解DFS,而且测试数据特水,连个剪枝都不用都可以过. 题目描述[luogu传送门] 现有一块大奶酪,它的高度为 h,它的长度 ...

  3. HTTP1.0,HTTP1.1,HTTP2.0的主要特征对比

    HTTP1.0 是一种无状态.无连接的应用层协议. HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务 ...

  4. excel中CTRL+E的用法

    偶然发现excel中CTRL+E有按照例子填充的功能. 结果如下

  5. Matlab调用C语言函数

    Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在 ...

  6. Tokio,Rust异步编程实践之路

    缘起 在许多编程语言里,我们都非常乐于去研究在这个语言中所使用的异步网络编程的框架,比如说Python的 Gevent.asyncio,Nginx 和 OpenResty,Go 等,今年年初我开始接触 ...

  7. Linux入门进阶第四天(下)——程序管理(补充内容)

    1.PID 触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置. 同一个程序 ...

  8. 学号 2016-2017-20155329《Java程序设计》课程总结

    学号 2016-2017-20155329<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:想象中的师生关系 预备作业2:C语言水平调查以及认为自己最强的一项技能和毕业 ...

  9. js获取IE版本,while代码很特别

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. RHCSA-考前准备

    1.考前准备 RHCSA classroom虚拟机和server虚拟机 将两台虚拟机切换到初始化快照 打开虚拟机电源,当出现提示时选择我已移动该虚拟机 系统密码: classroom: root As ...