菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
194
0

2020软件工程作业01

原创
05/13 14:22
阅读数 8075
这个作业属于哪个课程 软工-2018级计算机1班
这个作业要求在哪里 [https://edu.cnblogs.com/campus/zswxy/computer-science-class1-2018/homework/11877
这个作业的目标 学习使用GIT或者码云
学号 20188398

文章主体

码云项目地址

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(h) 实际耗时(h)
Planning 计划 0.5 0.5
Estimate 估计这个任务需要多少时间 12
Development 开发 2 3
Analysis 需求分析 (包括学习新技术) 2 1
Design Spec 生成设计文档 0.5 0.5
Design Review 设计复审 1 0.5
Coding Standard 代码规范 (为目前的开发制定合适的规范) 1 0.5
Design 具体设计 2 2
Coding 具体编码 2 2
Code Review 代码复审 0.5 1
Test 测试(自我测试,修改代码,提交修改) 2 2
Reporting 报告
Test Repor 测试报告 1 2
Size Measurement 计算工作量 0.5 0.5
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 1 1
合计 16 16.5

解题思路描述

看完题目描述,马上就想到了HashMap,单词-数量;这不就一键值对嘛。决定用HashMapd话思路就很清晰了,先把文本全读进内存进行一定的处理和判断后一个个单词放进HashMap里面,键为单词字符串,值为频次。

代码规范链接

点我

实现过程

根据遍历来统计字符数思路:一开始的想法是使用java中的正则表达式来匹配ASCII码,后续完成后在无意间发现通过readline会导致换行丢失且出现错误,后续经过验证后对自己的代码进行了修改,在该函数中进行了文件的read操作,并计数进行统计。


        BufferedReader bufferedReader = null;
        try{
            String pre_path=new File("").getAbsolutePath();
            bufferedReader = new BufferedReader(
                    new InputStreamReader(new FileInputStream( pre_path+ "\\" + filepath),"utf-8"));
            while((bufferedReader.read())!=-1)
            {
                char_num+=1;
            }
        }
        catch(...)
        if(bufferedReader!=null){
            bufferedReader.close();
        }
        return char_num;
    }

统计文件的单词总数思路:题意为获取为字母开头且长度大于4的单词数,使用正则表达式匹配。首先通过String类自带的split方法去拆开整篇文章使其形成一个数组,然后通过正则表达式去选择出正确的单词并作统计。

        // 构造正则表达式,去根据空格拆分整篇文章
        // temp字符串数组将保存所有的单词
        //处理特殊字符,以免被误以为是单词的一部分
        String[] temps = words.toString() .split("[^a-zA-Z0-9]");
        // 构造题意:以字母开头且长度大于4的单词
        String regexs = "^[a-zA-Z]{4,}.*";
        // 循环遍历这个数组,利用正则表达式去匹配
        for (int i = 0; i < temps.length; i++) {
            if (temps[i].matches(regexs)) {
                // 匹配成功,计数加1
                word_num++;
                //System.out.println(temps[i]);
            }
        }
        return word_num;

统计文件的有效行数思路:想通过获取文件中非空行的方式来进行统计,使用BufferdReader来读取文件,将要调用的文件放在src下.通过获取绝对路径的方式并与文件名拼接来查询文件,遍历行数累加。在构建文件对象的时候一开始使用了File直接来构建,发现其编码有误,不是UTF-8,且无法做修改,后续更换了InputStreamReader类型来让指定文件类型。

        String pre_path=new File("").getAbsolutePath();
        try {
            bufferedReader = new BufferedReader(
                    new InputStreamReader(new FileInputStream( pre_path+ "\\" + path),"utf-8"));
            String line;
            // 通过循环不断整行读取文件
            // 同时记录读取次数即可
            while ((line = bufferedReader.readLine()) != null) {
                //匹配任意非空白字符
                if (line.length() != 0 && !line.matches("\\s+")) {
                    line_num++;
                }
            }
        } catch (...)
        return line_num;
    }

统计文件中各单词的出现次数思路:词频统计我用map来存储键值对,首先还是做相同的正则匹配来获取所有单词,然后进行遍历加数,以(单词名,出现次数)键值对存入map中。在排序时构造匿名内部类来重写compare方法,先比较值,如果值相同,则比较键序。并且为了判断字典序再写了一个方法来进行比较。

        List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
        // 构造匿名内部类
        // 首先根据频率比较,如果频率相同,比较字典序
        list.sort((Comparator<Map.Entry>) (o1, o2)
                -> ((Integer) o1.getValue()).compareTo((Integer) o2.getValue()) != 0
                ? ((Integer) o2.getValue()).compareTo((Integer) o1.getValue()) : getCharNums((String)o1.getKey(),((String)o2.getKey())));
        // 返回list 前十个 数据,也即出现的前十的高频词
        return list.size() < 10 ? list.subList(0, list.size()) : list.subList(0, 10);
    }

文件存取功能思路:分别使用BufferedReader和BufferedWriter来进行文件的存取,增加了缓冲区对于性能有所提高,并且根据题意更换了File并使用InputStreamReader和OutputStreamWriter来替代,从而定义文件的默认编码。

        String pre_path=new File("").getAbsolutePath();
        try {
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(new FileInputStream( pre_path+ "\\" + path),"utf-8"));
            String temp;
            while ((temp = bufferedReader.readLine()) != null) {
                stringBuilder.append(temp).append("\n");
            }
            bufferedReader.close();
        } catch(...)
        return stringBuilder;
    }

        String pre_path=new File("").getAbsolutePath().toString();
        try {
            //生成的文件放在当前项目下
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream( pre_path+ "\\" + path),"utf-8"));
            bufferedWriter.write(message);
            bufferedWriter.flush();
            bufferedWriter.close();
        } catch (...)
    }

计算模块部分异常处理说明

JAVA自动捕获输出异常信息。

心路历程与收获

这次临近放假,所以很多工作做的很匆忙。但还是大体完成了任务要求。

发表评论

0/200
194 点赞
0 评论
收藏