20200917-2词频统计

此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206

词频统计 SPEC

本题有功能3和功能4未实现

已实现功能1,2,5运行截图如下:

 

我的思路是读取文件,失败的话显示读取失败,成功的话进而统计单词总数以及每个单词的频率。

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

本题难点(1)需要用FileBuffered和FileReader读取文件

               (2)读取文件统计每个单词出现的次数,并且重复单词不能重复计数,并且特殊字符也不计数。

关键代码:

if (f.length() < 40000) {


            try {
                BufferedReader a = new BufferedReader(new FileReader(file1));
                StringBuffer c = new StringBuffer();
                //将文件内容存入StringBuffer中
                while ((s = a.readLine()) != null) {
                    //用于拼接字符串
                    c.append(s);
                }

 

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

本题难点:本题也是读入再统计,只不过文件内存稍微大一些。与功能1有相似之处。

关键代码:

//将StringBuffer转换成String,然后再将所有字符转化成小写字符
                String m = c.toString().toLowerCase();
                System.out.println(m + '\n');
                //匹配由数字和26个字母组成的字符串
                String[] d = m.split("[^a-zA-Z0-9]+");
                //遍历数组将其存入Map<String, Integer>中
                Map<String, Integer> myTreeMap = new TreeMap<String, Integer>();
                for (int i = 0; i < d.length; i++) {
                    //containsKey()方法用于检查特定键是否在TreeMap中映射
                    if (myTreeMap.containsKey(d[i])) {
                        count = myTreeMap.get(d[i]);
                        myTreeMap.put(d[i], count + 1);
                    } else {
                        myTreeMap.put(d[i], 1);
                    }
                }
                System.out.println("total" + d.length );
                //通过比较器实现排序
                List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(myTreeMap.entrySet());
                //按降序排序
                Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {

                    public int compare(Entry<String, Integer> k1, Entry<String, Integer> k2) {
                        //返回两个单词出现次数较多的那个单词的出现次数
                        return k2.getValue().compareTo(k1.getValue());
                    }

                });

 

功能3(未实现):支持命令行输入存储有英文作品文件的目录名,批量统计。

本题难点:这道题要批量读入文件,之前只会读一个文件,这次要批量读入,接下来就和功能1、2有相似之处了。虽然 查了资料但是我没有完成批量读入文件。

关键代码:无

 

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

 本题未实现

 

 

功能5:

本题难点:本题将限定单词的长度,并把频率最高的top几单词输出,就需要在统计每个单词个数的时候也把长度统计,然后按排序输出。

关键代码:

System.out.println("请输入单词长度j位:");
n2 = sc.nextInt();

System.out.println("请输入词频前i位:");
n = sc.nextInt();
for (Entry<String, Integer> map : list) {
    if (map.getKey().length() <= n2){
        if (num <= n) {
            //输出到程序控制台
            System.out.println(map.getKey() +'\t' + map.getValue());
            num++;
        }
    }

}

 

 2.PSP

本次作业没有将功能全部实现的原因:

(1)自己本身编程能力薄弱,经过此次作业更加验证会一门编程语言的重要性。

(2)没有在第一时间开始本次作业,导致后面有些着急,对于未实现的功能如果有更多时间或许可以再研究出来。

(3)虽然已经预测到自己惨淡的分数,但尽量将功能5实现,希望能够弥补。

 

3.此程序上交在guithub,地址 

https://github.com/zhaoxinping-arch/work

 

 

 

 

 

 

 

posted @ 2020-09-23 17:59  zxp!  阅读(135)  评论(0编辑  收藏  举报