彭思雨20190912-3词频统计

作业要求 20180912-3 词频统计

该作业的要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583

代码地址:https://e.coding.net/xintongxue123/cipin.githttps://e.coding.net/xintongxue123/cipin.githttps://e.coding.net/xintongxue123/cipin.git

一、程序完成

老五在寝室吹牛他熟读过《鲁滨逊漂流记》,在女生面前吹牛热爱《呼啸山庄》《简爱》和《飘》,在你面前说通读了《战争与和平》。但是,他的四级至今没过。你们几个私下商量,这几本大作的单词量怎么可能低于四级,大家听说你学习《构建之法》,一致推举你写个程序名字叫wf,统计英文作品的单词量并给出每个单词出现的次数,准备用于打脸老五。

希望实现以下效果。以下效果中数字纯属编造。

功能1 小文件输入。 为表明程序能跑,结果真实而不是迫害老五,请他亲自键
盘在控制台下输入命令。

为了评估老五的词汇量而不是阅读量,total一项中相同的单词不重复计数数,出现2
次的very计数1次。

因为用过控制台和命令行,你早就知道,上面的">"叫做命令提示符,是操作系统的一部分,而不是你的程序的一部分。

此功能完成后你的经验值+10.

重点难点:这个功能相对简单,主要是要考虑小文件中存在的英文标点符号,我做的是遇到标点符号就替换为空格,然后以空格进行分割,读取文件内容,不区分大小写,单词相同时,count+1。

代码展示:

 1        System.out.println("是一个文件\n");
 2                 try{
 3                     BufferedReader reader = new BufferedReader(new FileReader(file));//文件存放位置
 4                     //reader.readLine();
 5                     String line = null;
 6                     while ((line = reader.readLine()) != null) {      //按行读取,每一行为一个字符串
 7                      String a = line.replace(".", " "); //遍历文本,将文本中的标点符号用空格替代
 8                      String b = a.replace(",", " ");
 9                      String c = b.replace("!", " ");
10                      String d = c.replace("?", " ");
11                      String e =d.replace(";", " ");
12                      String f =e.replace("$", " ");
13                      String g =f.replace("*", " ");
14                      String h =g.replace("#", " ");
15                      String l =h.replace("&", " ");
16                      String k =l.replace("\"", " ");
17                      String m =k.replace("\'", " ");
18                      String[] arr = m.split(" ");
19                         for (int i =0;i<arr.length;i++){  //判断map中是否包含这个单词,没有就添加(单词,1)否则就value+1
20                             if(!map.containsKey(arr[i])){
21                                 map.put(arr[i],1L);
22                             }else {
23                                 Long x = map.get(arr[i]);
24                                 map.put(arr[i],++x);
25                             }
26                         }
27            

运行截图:

 

功能2 支持命令行输入英文作品的文件名,请老五亲自录入。

此功能完成后你的经验值+30. 输入文件最大不超过40MB. 如果你的程序中途崩
了,会被老五打脸,不增加经验值。

重点难点:统计一本书中的每个单词出现的次数,单词量比较多,我认为比较困难,我是把要读取的文件全部放到指定E盘文件中,重点还是要区分标点符号(我标点符号这块代码没有考虑完全,只是常见的列出并替代),这个功能我做的和功能3十分相似,可以一起读好几个文件,只是功能3我将合并读的文件放入文件夹了。

关键代码:

 1 //外部传参,传入几个读取几个
 2             File file = new File("E:\\homework03\\"+args[j]);
 3             if(file.isDirectory()){
 4                 File[] list = file.listFiles();
 5                 for(File fi : list){
 6                     try{
 7                      int q = fi.toString().lastIndexOf("\\");
 8                      String split = fi.toString().substring(q+1);
 9                      System.out.println(split);
10                      BufferedReader reader = new BufferedReader(new FileReader(fi));//文件存放位置
11                      String line = null;
12                      while ((line = reader.readLine()) != null) {      //按行读取,每一行为一个字符串
13                      String a = line.replace(".", " "); //遍历文本,将文本中的标点符号用空格替代
14                      String b = a.replace(",", " ");
15                      String c = b.replace("!", " ");
16                      String d = c.replace("?", " ");
17                      String e =d.replace(";", " ");
18                      String n =e.replace("$", " ");
19                      String g =n.replace("*", " ");
20                      String h =g.replace("#", " ");
21                      String l =h.replace("&", " ");
22                      String k =l.replace("\"", " ");
23                      String m =k.replace("\'", " ");
24                      String[] arr = m.split(" ");
25                       for (int i =0;i<arr.length;i++){  //判断map中是否包含这个单词,没有就添加(单词,1)否则就value+1
26 
27                                 if(!map.containsKey(arr[i])){
28                                     map.put(arr[i],1L);
29                                 }else {
30                                     Long x = map.get(arr[i]);
31                                     map.put(arr[i],++x);
32                                 }
33                             }
34     

运行截图:

 

功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。
重点难点:做批量处理,就是不用在控制台中输入某一个具体的英文作品名,只通过文件路径,就能遍历到文件夹中所含的所有英文作品,然后排序汇总。

在功能2的基础上多一个判断和遍历文件夹。

关键代码:

1     if(file.isDirectory()){
2                 File[] list = file.listFiles();
3                 for(File fi : list){
4                     try{
5                      int q = fi.toString().lastIndexOf("\\");
6                      String split = fi.toString().substring(q+1);
7                      System.out.println(split);
8 }

运行截图:

 

因为单词量巨大,只列出出现次数最多的10个单词。
此功能完成后你的经验值+8.

功能4 从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋
友炫酷,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活
的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管
这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。

重点难点:理解重定向的含义。

运行截图:

 

 

排序:

代码:

//对map集合value进行排序。
    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map, boolean isDesc) {
        Map<K, V> result = Maps.newLinkedHashMap();
        if (isDesc) {//降序
            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByValue().reversed())
                   .forEach(e -> result.put(e.getKey(), e.getValue()));
        } else {
            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByValue())
                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
        }
        return result;
    }

  二、 PSP阶段表格

类别

预计花费时间min

实际花费时间min

时间差min

功能1

100

66

34

功能2

100

98

2

功能3

100

129

29

功能4

100

37

63

测试

15

22

7

原因分析:对java语言没有完全掌握,遗漏的知识点很多。而且刚开始是每个功能模块分开写的,后来做到功能3,发现代码与功能2的交集很多,就合并了,合并时候出现一些问题,中间也有很长时间的间隔,也就导致整体用时拉长,总之还是没有做好充分的需求分析。

 

 

 

 

 

 

posted @ 2019-09-18 01:15  彭思雨  阅读(214)  评论(0编辑  收藏  举报