需求概要

原需求

1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符。

2.统计英文单词在本文件的出现次数

3.将统计结果排序

4.显示排序结果

新需求:

1.小文件输入. 为表明程序能跑

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

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

4. 从控制台读入英文单篇作品

程序输入:

1.控制台输入文本

2.英文文本文件

3.英文目录,目录下包含单个或多个英文文本文件

程序输出:

1.英文单词在本文件或控制台输入中的出现的次数,按出现次数排序

2.文本或控制台输入文字的单词数和不重复单词数

输出位置:

控制台或指定文件

支持统计的词包括:纯英文单词和字母开头夹杂数字的单词,例如:happy,x11,i386,w3c等

程序的使用设计

1.程序直接运行,不加参数,则进入标准输入状态,所有标准输入作为词频统计分析的内容,windows下回车加ctrl+Z作为退出输入模式的出口,然后对输入缓存进行统计

2.使用选项参数

默认情况下接受文件名或文件夹作为输入,读入单独或文件夹下的多个文件

-o可以指定输出文件名,即保存统计结果到文件中,不适用-o选项则将输出结果打印到终端或控制台,

-s出现此选项则将之后的输入视为标准输入,作为分析的内容。

主要功能设计和分析

前一部分的内容不在此赘述,以下为更新后的功能设计

不同输入逻辑处理

根据最新需求,本程序需要处理来自文本和控制台的输入,需要对程序运行的参数和方法进行控制,java程序的main函数String[] args可以接收程序运行的参数,当参数为空时则进入标准输入读入的模式,有参数的时候根据不同参数进行操作。

为简化逻辑,参数的读入和初始化可以建立初始化器来使用的参数进行环境设置或者初始化,main函数中则根据已经设定好的环境来决定从哪读入向哪输出。

缓冲读取文件或标准输入流,统计词频

当程序参数为空时需要将标准输入作为待分析内容,java提供的System.in可作为标准输入,读入时可以使用byte[]来接收。

当程序读入文件时可以使用char[]来接收读取到的内容,这与标准输入流略有不同,不过可以通过类型转换的方式来实现重用。

词频统计与之前的区别在于,使用BufferedReader提供的read来替换readline来解决当行过长导致的字符串溢出问题,这样就需要定义一个缓冲区来分块读取文件或输入流的内容,读取到的缓冲区再模仿状态机的处理方式来确定读入的字符该如何处理

多文件的读取

java文件类提供判断一个路径是不是文件夹的函数即File.isDirectory(),如果确定输入为文件夹则使用File.listFiles()获取到文件夹下的所有文件,然后循环分析词频,根据已经创建好的环境决定输出到文件还是控制台。

部分代码实现

初始化器实现

 1     String inputFile = null;
 2     String outputFile = null;
 3     boolean stdin = false;
 4
 5     private boolean setArgs(String[] args) {
 6         try {
 7             if (args.length == 0) {
 8                 stdin=true;
 9                 return true;
10             }
11             boolean isOption = false;
12             for (int i = 0; i < args.length; i++) {
13                 if (args[i].startsWith("-")) {
14                     isOption = true;
15                     if (args[i].equals("-o")) {
16                         outputFile = args[i + 1];
17                     } else if(args.equals("-s")){
18                         stdin = true;
19                         return true;
20                     }else{
21                         System.out.println("unknow commend:" + args[i]);
22                         return false;
23                     }
24                 } else if (isOption) {
25                     // setOpetion
26                     isOption = false;
27                 } else if (inputFile == null) {
28                     inputFile = args[i];
29                 } else {
30                     System.out.println("wrong command");
31                     return false;
32                 }
33             }
34             System.out.println("inputfile = " + inputFile);
35             System.out.println("onputfile = " + outputFile);
36             if (inputFile == null) {
37                 System.out.println("no input file name");
38                 return false;
39             }
40         } catch (Exception e) {
41             System.out.println("wrong command");
42             return false;
43         }
44         return true;
45     }

更新后的词频统计

文件方式作为输入

 1     public Map<String, Integer> getWordGroupCountBuffered(String filename) {
 2         try {
 3             FileReader fr = new FileReader(filename);
 4             BufferedReader br = new BufferedReader(fr);
 5             StringBuffer content = new StringBuffer("");
 6             Map<String, Integer> result = new HashMap<String, Integer>();
 7             char[] ch = new char[64];
 8             int bs = 0;
 9             int idx;
10             boolean added = false;
11             total = 0;
12             while ((bs = br.read(ch)) > 0) {
13                 for (idx = 0; idx < bs; idx++) {
14                     if (isCharacter(ch[idx])==1) {
15                         content.append(ch[idx]);
16                         added = false;
17                     } else if(isCharacter(ch[idx])==2){
18                         if(added == true){
19                             continue;
20                         }else{
21                             content.append(ch[idx]);
22                         }
23                     } else {
24                             if(added==true){
25                                 continue;
26                             }
27                             added = true;
28                             if(content.equals(""))
29                                 continue;
30                             String key = content.toString();
31                             if (result.containsKey(key))
32                                 result.put(key, result.get(key) + 1);
33                             else
34                                 result.put(key, 1);
35                             total++;
36                             content = new StringBuffer("");
37                             continue;
38                     }
39
40                 }
41             }
42             br.close();
43             fr.close();
44             return result;
45         } catch (FileNotFoundException e) {
46             System.out.println("failed to open file:" + filename);
47             e.printStackTrace();
48         } catch (Exception e) {
49             System.out.println("some expection occured");
50             e.printStackTrace();
51         }
52         return null;
53     }

标准输入作为输入

 1     public Map<String, Integer> getWordGroupCountBuffered(InputStream in) {
 2         try {
 3             StringBuffer content = new StringBuffer("");
 4             Map<String, Integer> result = new HashMap<String, Integer>();
 5             byte[] bt = new byte[128];
 6             char [] ch = new char[64];
 7             int bs = 0;
 8             int idx;
 9             int cs = 0;
10             boolean added = false;
11             total = 0;
12             while ((bs = in.read(bt)) > 0) {
13                 ch = byteToChar(bt,bs);
14                 cs = bs;
15                 for (idx = 0; idx < cs; idx++) {
16                     if (isCharacter(ch[idx])==1) {
17                         content.append(ch[idx]);
18                         added = false;
19                     } else if(isCharacter(ch[idx])==2){
20                         if(added == true){
21                             continue;
22                         }else{
23                             content.append(ch[idx]);
24                         }
25                     } else {
26                             if(added==true){
27                                 continue;
28                             }
29                             added = true;
30                             if(content.equals(""))
31                                 continue;
32                             String key = content.toString();
33                             if (result.containsKey(key))
34                                 result.put(key, result.get(key) + 1);
35                             else
36                                 result.put(key, 1);
37                             total++;
38                             content = new StringBuffer("");
39                             continue;
40                     }
41
42                 }
43             }
44             return result;
45         } catch (Exception e) {
46             System.out.println("some expection occured");
47             e.printStackTrace();
48         }
49         return null;
50     }

文件夹下多文件统计函数头为

1 public void printSortedWordGroupCountToFileBuffered(File[] files, String destinationFilename)

实现方式基本同单个文件统计方式,仅需添加循环遍历和输出文件方式设定为追加,并且第一次打开时清空文件内容,防止多次执行同一命令时重复追加到一个文件。

主函数逻辑控制

 1     public static void main(String[] args) {
 2         RunFileWordUtil rfu = new RunFileWordUtil();
 3         if (!rfu.setArgs(args)) {
 4             return;
 5         }
 6         File f = null;
 7         FileWordUtil fu = new FileWordUtil();
 8         if(rfu.stdin){
 9             fu.printSortedWordGroupCountBuffered(System.in);
10         }else{
11             f = new File(rfu.inputFile);
12             if(f.isDirectory()){
13                 File[] files = f.listFiles();
14                 if(rfu.outputFile == null){
15                     System.err.println("warning : print to console is not recomanded");
16                     fu.printSortedWordGroupCountBuffered(files);
17                 }else{
18                     fu.printSortedWordGroupCountToFileBuffered(files,rfu.outputFile);
19                 }
20             }else if (rfu.outputFile == null) {
21                 System.err.println("warning : print to console is not recomand");
22                 fu.printSortedWordGroupCountBuffered(rfu.inputFile);
23             }else {
24                 fu.printSortedWordGroupCountToFileBuffered(rfu.inputFile, rfu.outputFile);
25             }
26         }
27     }

其他被调用的部分自定义函数

 1     private int isCharacter(char ch) {
 2         if ((ch >= 'a' && ch <= 'z'))
 3             return 1;
 4         if((ch >= 'A' && ch <= 'Z'))
 5             return 1;
 6         if(ch>='0'&&ch<='9')
 7             return 2;
 8         return 0;
 9     }
10
11     private char[] byteToChar(byte[] bt,int length){
12         char[] ch = new char[length];
13         for(int i=0;i<length;i++){
14             ch[i]=(char)bt[i];
15         }
16         return ch;
17     }

实际运行结果

1.标准输入作为输入内容

2.单个文件作为输入内容

文件内容:

hello world
this is a
what a sunny day!
do
you
have a cup?read the bookMy English is very very pool.  

warning为标准错误输出,在支持彩色显示的终端中可以显示为红色(或其他自定义颜色)

3.文件夹下的所有文件作为输入内容

4.结果输出到文件

5.大文件统计:

文件内容:英文版WarandPeace.txt

工程地址:https://coding.net/u/jx8zjs/p/wordCount/git

ssh://git@git.coding.net:jx8zjs/wordCount.git

转载于:https://www.cnblogs.com/jx8zjs/p/5862269.html

词频统计的java实现方法——第一次改进相关推荐

  1. Python实现词频统计的两种方法

    词频统计是指在文本中计算每个单词出现的次数,是文本处理中一个最基本的任务.在Python中,可以使用多种方法实现词频统计,包括使用字典.列表.Counter类等数据结构. 一.使用字典 其中,使用字典 ...

  2. Python如何进行词频统计?3种方法教给你

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于快学Python ,作者小小明 Python爬虫.数据分析.网站开发等案例教程 ...

  3. Java:词频统计程序

    词频统计程序(Java) 题目描述:        做一个词频统计程序,该程序具有以下功能:         基本要求:      (1)可导入任意英文文本文件      (2)统计该英文文件中单词数 ...

  4. Hadoop | MapReduce之 WordCount词频统计

    WordCount词频统计 词频统计 WordCountMap.java // Map类,继承于org.apache.hadoop.mapreduce.Mapper; public class Wor ...

  5. Python字典简单实现词频统计

    目录 问题引入: 原理: 基本流程: 词频统计 ①录入待统计的句子 ②分割为多个单词 ③创建字典 利用Python内置库快速实现词频统计 全部代码 普通方法 方法二:get()实现 内置库实现 Pyt ...

  6. java统计词频算法_Java实现的词频统计——功能改进

    本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入--从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...

  7. Hadoop的改进实验(中文分词词频统计及英文词频统计)(1/4)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的百度云(联网),和Ubuntu系统的hadoop1-2-1(自己提前配好).如不 ...

  8. JAVA小练习之英文文本词频统计(三)

    写在开头:本次的小练习主要会运用一些字典的排序,由于对JAVA不是很熟悉,所以有的地方会不太能够解读,搜索了部分网上的资料. 英文文本词频统计 任务目标:统计英文文本中出现频率最高的5个单词,需要处理 ...

  9. Hadoop的改进实验(中文分词词频统计及英文词频统计)(2/4)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的百度云(联网),和Ubuntu系统的hadoop1-2-1(自己提前配好).如不 ...

最新文章

  1. JavaScript模块化开发整理
  2. mysql 联合索 B 树_MySQL 索引与 B+ 树
  3. vc++ 动态加载位图
  4. 用Kotlin打造一个Router
  5. Arrays.asList()使用时的注意事项,这个结论同可适用于Stream.of()___Arrays.stream和Stream.of
  6. vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...
  7. python 天勤 金叉 编程代码_Python量化策略开发框架,固定的套路、突破策略的福音...
  8. 深度神经网络编程细节
  9. Node JS和MongoDB的集成简单示例
  10. mysql不安装在c_MySQL 的模块不能安装的解决方法
  11. 万能表单资料管理系统
  12. appium之定位方式
  13. 阿里P7大牛手把手教你!java全栈工程师证书
  14. c语言博物馆文物管理系统,博物馆文物智能管理系统.docx
  15. 为什么蓝牙电子产品要做BQB认证
  16. android保存到本地的图片、视频相册里找不到怎么办?
  17. 解决查看 Hotmail 电子邮件乱码
  18. win7无线热点_智能手机变成台式电脑的无线网卡来使用并连接WIFI上网的方法
  19. 雷帝嘎嘎:可以写汉字的洒水三轮车
  20. 搜狗专用超级单泛站群霸屏版-搜狗蜘蛛池收录

热门文章

  1. 实例:使用纹理对象创建Sprite对象
  2. 数据集蒸馏 by Matching Training Trajectories
  3. 京东发布FastReID:目前最强悍的目标重识别开源库!
  4. ICCV 2019 | 基于全局类别表征的小样本学习
  5. Kaggle新上比赛:Google AI发起地域包容性图像识别竞赛
  6. 怎么用Python获取全网最全的杰尼龟表情包
  7. 零基础入门学习Python,我与python的第一次亲密接触后的感受
  8. 《创造奇迹的编程语言也有黑历史!原来他还有这副面孔?!》
  9. 《python透明人士,他是凭什么成为主流编程的宠儿?!》python基础语法
  10. html中prependid的作用,UIForm与prependId =“false”中断