• 202103226-1 编程作业


    这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-science-class3-2018/homework/11879
    这个作业的目标 1.学习使用git和github 2.编写WordCount程序 3.总结
    学号 20188483
    其他参考文献 《构建之法》,CSDN

    gitee地址:
    https://gitee.com/flz13873652172/project-java

    PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 30 43
    • Estimate • 估计这个任务需要多少时间 30 43
    Development 开发 780 1030
    • Analysis • 需求分析 (包括学习新技术) 120 260
    • Design Spec • 生成设计文档 30 60
    • Design Review • 设计复审 10 15
    • Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 25
    • Design • 具体设计 90 110
    • Coding • 具体编码 360 400
    • Code Review • 代码复审 20 10
    • Test • 测试(自我测试,修改代码,提交修改 120 150
    Reporting 报告 135 145
    • Test Repor • 测试报告 90 100
    • Size Measurement • 计算工作量 15 10
    • Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 30 35
    合计 1030 1217
    解题思路描述
    一、需求分解
    首先我根据作业要求,把需求分解成以下小部分
    
    读取文件内数据
    统计文件字符数
    统计文件单词总数
    统计文件有效行数
    统计出现频率最高的10个单词
    以UTF-8格式输出到指定文件
     
    
    代码规范制定链接
    https://gitee.com/flz13873652172/project-java/blob/master/codestyle.md
    
    设计与实现过程
    一、类构建组织
    为了实现功能独立,我将需求2、3、4、5封装在WordCountMethods类,进行字符数量、行数、单词数、词频的统计;将需求1、6封装进WordCountIO类,:进行文件内容的读取,以及处理结果的写入;最后设计一个WordCount类调用以上两个类的方法去实现WordCount功能。
    
    二、主要方法设计
    2.1 WordCountIO/读取文件转化为string形式
    
    FileInputStream fileinputstream=new FileInputStream(filePath);
    InputStreamReader inputstreamreader=new InputStreamReader(fileinputstream);
    br = new BufferedReader(inputstreamreader);
    int c;
    while ((c = br.read()) != -1) {
        strBud.append((char) c);
    }
    br.close();
    return strBud.toString();
    
    2.1.1 解释思路
    最开始我是想到用BufferedReader中包装InputStreamReader类,但是一开始程序用的是BufferedReader类的readline(),后期单元测试的时候发现问题,readline当遇到换行符('
    '),回车符('
    ')时会终止读取表示该行文字读取完毕且返回该行文字(不包含换行符和回车符),就会导致无法统计换行符、回车符,于是后来改用read(),读取1个或多个字节,返回一个字符,当读取到文件末尾时,返回-1。
    
    2.2 WordCountMethods/统计文件有效行数
    
    InputStream inpStr = new FileInputStream(filePath);
    BufferedReader br = new BufferedReader(new InputStreamReader(inpStr));
    //空白行的正则匹配器
    Pattern blankLinePattern = Pattern.compile(BLANK_LINE_REGEX);
    String line = null;
    while ((line = br.readLine()) != null) {
        if (blankLinePattern.matcher(line).find()) {
        //是空白行就计数
            blankLine++;
        }
        allLine++;
    }
    //有效行是总行数减去空白行数
    validLine = allLine-blankLine;
    return validLine;
    
    2.2.1 解释思路
    
    我的想法是统计出所有行数减去空白行就是有效行数.但是如何判断哪一行是空白行是个关键问题。
    我经过上网搜索查阅资料,发现可以使用正则表达式"s+"
    正则表达式中s+匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ f
    
    	v]
    
    f -> 匹配一个换页
    
     -> 匹配一个换行符
    
     -> 匹配一个回车符
    	 -> 匹配一个制表符
    v -> 匹配一个垂直制表符
    
     2.3 WordCountMethods/统计合法单词数
    int words = 0;
    //先全部转小写
    String lowerStr = str.toLowerCase();
    //匹配非单词非数字的字符
    Pattern pat = Pattern.compile(UN_ALPHABET_NUM_REGEX);
    Matcher mat = pat.matcher(lowerStr);
    //转换为空格
    lowerStr = mat.replaceAll(" ");
    //按规定的分隔符拆分
    String[] word = lowerStr.split("\s+");
    for (int i = 0; i < word.length; i++) {
        String tw = word[i];
        //判断是不是要求的单词
        if (tw.matches(FIRST_FOUR_APLH_REGEX)) {
            words++;
            if (!map.containsKey(tw)) {
                map.put(tw, 1);
            } 
            else {
                int num = map.get(tw);
                map.put(tw, num + 1);
            }
        }
    }
    
    2.4 WordCountMethods/统计出现频率最高的单词
    
    Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){
    //Treemap只要比较出现次数,不用再比较字典序
    public int compare(Map.Entry<String, Integer> word1, Map.Entry<String, Integer> word2) {
        return word2.getValue() - word1.getValue();
    }
    


    心路历程与收获

    感觉太难了,第一关git的使用就不会,后来自己在b站看视频讲解会了(地址:https://www.bilibili.com/video/BV1FE411P7B3?p=9&spm_id_from=pageDriver)
    也非常感谢我的室友的帮助,打代码的过程中出现了很多问题,还是自己专业知识不够丰富,还得多多学习;
    希望老师下次别弄这么难的了,孩子心里苦呀
    
  • 相关阅读:
    mysqlEasyHelper(待完善)
    入门day2
    入门day1
    c# 多态的理解
    c# 简单任务控制
    c# 陌生的关键字
    从0来搭建超灵活的MVP商用框架<三>-------网络层加入RxJava、事件总线封装、Dagger2集成
    从0来搭建超灵活的MVP商用框架<二>-------APP基础配置、Okhttp+Retrofit封装
    从0来搭建超灵活的MVP商用框架<一>-------从MVC至MVP的转变、通用网络切换框架
    IOC注入框架设计<三>-------Android Studio插件开发来自动生成ButterKnife相关代码
  • 原文地址:https://www.cnblogs.com/FLZ1208/p/14608918.html
Copyright © 2020-2023  润新知