• 个人作业2


    1、码云地址

    2、PSP表格

    PSP2.1 个人开发流程 预估耗费时间(分钟) 实际耗费时间(分钟)
    Planning 计划 10 5
    · Estimate 明确需求和其他相关因素,估计每个阶段的时间成本 5 0
    Development 开发 200 210
    · Analysis 需求分析 (包括学习新技术) 10 15
    · Design Spec 生成设计文档 15 10
    · Design Review 设计复审 10 10
    · Coding Standard 代码规范 0 0
    · Design 具体设计 20 25
    · Coding 具体编码 90 80
    · Code Review 代码复审 10 5
    · Test 测试(自我测试,修改代码,提交修改) 20 50
    Reporting 报告 10 10
    · 测试报告 10 5
    · 计算工作量 5 5
    · 并提出过程改进计划 0 0

    3、解体思路描述:

    整体思路:

    读取文件,把文本内容转换为字符串,将字符串作为参数传入到方法中,去然后在去做字符数、有效行数的统计。然后在将此字符串在进行截取,把它转为以空格为分隔符的字符串,做单词总数和词频的统计。

    各功能思路:

    • 统计文件的字符数:将文本转换为字符数组,然后遍历数组,判断是否为合法字符,设置统计变量,然后返回字符数。
    • 统计有效行数:将字符串作为参数传入,用String.split()方法以回车换行符为正则表达式截取,遍历字符串数组,将长度大于0的记为有效行数,返回有效行数。
    • 截取有效单词:先文本字符串作为参数传入,转为字符数组。创建StringBuffer对象,遍历数组,判断字符是否为英文字符或空格,若是用StringBuffer拼接,否则则拼接上一个空格符。得到一个一个以空格为分隔符的字符串,在以空格截取字符串,转为字符串数组,遍历数组,判断是否满足前四个字母为英文的单词。若是则再用StringBuffer拼接,否则跳过。最后返回一个以有效单词组成,以空格为分隔符的字符串。
    • 统计单词总数:将有效单词字符串作为参数传入,用String.spilt()方法分割,返回字符串数组长度,及有效单词总数。
    • 统计单词出现频率:用String.spilt()方法分割,遍历数组。使用map来统计词频,先判断Map中是否存在相同单词,如果不存在,则存入Map并将value置为1,若存在,则将其value值加1。最后返回map。
    • 词频排序:使用比较器排序。

    4、设计实现过程

    1.类设计:

    • FileRead类:读取文件。
    • Word类:实现功能
    • Test类:程序入口,测试。

    2.FileRead类:

    • fileRead方法:按行读取文件,拼接各行数据,返回文本字符串。

    3.Word类:

    • getCharCount()方法:统计字符数
    • getLineCount()方法:统计有效行数
    • getWord()方法:截取有效单词,为统计单词出现次数、单词总数服务
    • getWordCount()方法:统计单词总数
    • getWordFrequency()方法:统计单词出现频率
    • sort()方法:对词频排序

    5、代码说明

    1、getCharCount()方法(统计字符数)

        public int getCharCount(String text) {
    	char[] c = text.toCharArray();
    	int count = 0;
    	for (char cTemp : c) {
    		if ((cTemp >= 32 && cTemp <= 126) || cTemp == '
    ' || cTemp == '
    ' || cTemp == '	') {
    			count++; // 判断合法字符
    		}
    	}
    	return count;
    }
    

    2、public int getLineCount()方法(统计有效行数)

        public int getLineCount(String text) {
    	    String[] len = text.split("
    ");	//以回车为分隔符
    	    int count = 0;
        	for (String str : len) {
    		    if (str.length() > 0) {		//有效行
    			    count++;
    		    }
            }
    	return count;
        }
    

    3、public String getWord()方法(截取合法单词)

        public String getWord(String text) {
    	char[] c = text.toCharArray();
    	StringBuffer str = new StringBuffer();
    	for (int i = 0; i < c.length; i++) {
    		if ((c[i] >= 48 && c[i] <= 57) || (c[i] >= 65 && c[i] <= 90) || (c[i] >= 97 && c[i] <= 122) || c[i] == 32) {
    			str.append(c[i]); // 截取以字母数字组成的单词
    		} else {
    			if (i == 0) {
    				continue;
    			}
    			str.append(" "); // 单词间的分隔符
    		}
    	}
    	String textTemp = str.toString();
    	str.setLength(0);
    	String[] word = textTemp.split(" +");
    	for (String s : word) {
    		if (s.length() < 4) {
    			continue;
    		} else {
    			for (int i = 0; i < 4; i++) { // 判断前四个字母是英文字母
    				boolean flag = false;
    				if (!(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z' || s.charAt(i) >= 'a' && s.charAt(i) <= 'z')) {
    					break;
    				}
    				if (i == 3) {
    					str.append(s + " ");
    				}
    			}
    		}
    	}
    	textTemp = str.toString();
    	System.out.println(textTemp);
    	return textTemp; // 返回单词字符串,以空格为分隔符
    }
    

    4、getWordCount()方法(统计单词总数)

        public int getWordCount(String text) {
    	if(text.length() == 0) {
    		return 0;
    	}
    	String[] word = text.split(" +");
    	return word.length;
    }
    

    5、getWordFrequency()(统计单词出现频率)

       	public Map getWordFrequency(String text) {
        	Map<String, Integer> map = new HashMap<>();
    	String[] strTemp = text.split(" +");
    	for (String s : strTemp) {
                    if (!map.containsKey(s)) {	//单词首次出现,存入map,置值为1
                        map.put(s, 1);
                    else {
                        map.put(s, (map.get(s) + 1));	//单词已存在,值加1
                    }	
                }
    	return map;
    }
    

    6、sort()方法(排序)

        public List sort(Map map) {
            List<Map.Entry<String, Integer>> arraylist = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
            Collections.sort(arraylist, new Comparator<Map.Entry<String, Integer>>() {	//重写比较器
                public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2) {
                    return ((Integer) obj2.getValue()).compareTo((Integer) obj1.getValue());
                }   
            });
            return arraylist;
        }
    

    6、单元测试

    设计了4个测试点:

    • 测试文件内容为空

    • 测试单词都是不合法

    • 测试单词都为合法

    • 测试文本中含合法、不合法单词

    7、实验心得

    这次实验小项目让自己感到专业知识的欠缺,倍感折磨,但却收益良多。对java的重温,认识到了在开发前作好规划的重要性,一定不能是想到一点写一点。在单元测试方面确实有很大的欠缺,一窍不通,还是习惯做断点测试。对此我将不断的去学习,争取下次做得更好。

  • 相关阅读:
    Vue Router详细教程
    Vue CLI使用
    百度点选识别,单字90+
    CPU毫秒级 | 极验点选识别
    Linux内核之进程管理
    Linux内核之基本概念
    MySQL InnoDB技术内幕:内存管理、事务和锁
    ZooKeeper简介
    分布式一致性协议之ZAB
    图解HTTP读书笔记
  • 原文地址:https://www.cnblogs.com/hamawep789/p/9664726.html
Copyright © 2020-2023  润新知