• 编码作业


    第二部分

    项目地址

    git地址

    表格

    psp2.1 Personal Software Process Stages 预估耗时(min) 实际耗时(min)
    Planning 计划 34 67
    Estimate 估计这个任务需要多少时间 34 54
    Develoment 开发 1000 1140
    Analysis 需求分析(包括学习新技术) 200 240
    Design Spec 生成设计文档 30 40
    Design Review 设计复审 25 20
    Coding Standard 代码规范设计 46 56
    Design 具体设计 60 70
    Coding 具体编码 400 567
    Code Review 代码复审 60 60
    Test 测试(自我测试,代码修改,提交修改) 60 60
    Reporting 报告 30 30
    Test Repor 测试报告 20 15
    Size Measuremen 计算工作量 20 15
    Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 20 25
    合计 1024 1340

    解题思路描述

    1.文件数处理,将文件数据直接从文件中取出,获得结果后将结果拼接成字符串,利用bufferedwriter写入文件中,读取文件数据使用bufferedreader。
    2.文件中字符串的长度直接使用length()方法获取,在返回字符串长度。
    3.单词数的统计采用正则表达式来分割字符串,再用matches()方法获取匹配的单词,忽略字符数小于4,数字开头等。在利用map<string ,integer>,将单词和对应出现次数加入wordMap中。
    4.统计行数,利用bufferedreader中的readline()方法,整行读取,读取整行数据同时判断是否为空行,为空则忽略改行。直到最后为空,文件完全读取。
    5.对单词出现的频率进行排序。利用map<string,intger>对象,利用sort方法和匿名内部类的比较器进行排序,最后返回一个list对象。
    6.将数据拼接成完整字符串,利用bufferedwriter写入对应的文件中。
    代码规范链接

    设计与实现过程

    1.读取文件数据
    public static String charactersCount(String filePath)
    {

        BufferedReader bReader=null;
        StringBuilder str=null;
    
        try 
        {
            FileReader reader=new FileReader(filePath);
            bReader=new BufferedReader(reader);
            str=new StringBuilder();
            int flag;
            //str.append(bufferedReader.read());
            while ((flag=bReader.read())!=-1)
            {
                str.append((char)flag);
            }
        } catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }finally 
        {
            try 
            {
                bReader.close();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    
        return str.toString();
    }
    

    2.字符数统计
    //字符数总数统计
    public static int charactersNumberCount(String str)
    {

    	//将字符串改为字符
        char[] ch = str.toCharArray();
        int num = 0;
        for(int i = 0; i < ch.length; i++) {
            if(ch[i] >= 0 && ch[i] <= 127) {
                num++;
            }
        }
        
        return num;
    }
    

    3.行数统计,利用readerline每次读取一行,在判断该行是否为空行
    //计算行数
    public static int linesNumberCount(String filePath)
    {
    File file=new File(filePath);
    int count=0;

    	if(file.exists()) 
    	{
    		try
    		{
    			BufferedReader in = new BufferedReader(new FileReader(file));
    			String line;
    			while((line = in.readLine()) != null)
    			{
    				//忽略空行
    				if(!line.equals("") )
    				{
    					count ++;
    				}
    			}
    			//System.out.print(count);
    			in.close();
    		}
    		catch(FileNotFoundException e)
    		{
    			e.printStackTrace();
    		}
    		catch(IOException e)
    		{
    			e.printStackTrace();
    		}
    		
    	}
    
        return count;
    }
    

    4.按照单词出现频数进行排序
    //按单词频率进行排序
    public List<Map.Entry<String,Integer>> SortMap()
    {

        List<Map.Entry<String,Integer>> wordList=new ArrayList<Map.Entry<String, Integer>>(wordsMap.entrySet());
    
        Collections.sort(wordList, new Comparator<Map.Entry<String, Integer>>() 
        {
        	
        	//利用匿名内部类实现排序
            @Override
            public int compare(Map.Entry<String, Integer> map1, Map.Entry<String, Integer> map2) 
            {
                if (map1.getValue().equals(map2.getValue()))
                {
                    return map1.getKey().compareTo(map2.getKey());
                }
                else 
                {
                    return map2.getValue()-map1.getValue();
                }
            }
        	
        });
    
        return wordList;
    }
    

    性能改进
    在单词排序部分利用匿名内部类的方式利用比较器提高比较速度。
    单元测试
    对字符数,单词数统计和行数统计都进行了测试
    1.字符数统计测试
    public void testCharactersNumberCount() {
    String str="helloworld myname isjohn";
    String strTest="";
    for(int i=0;i<10000;i++)
    strTest+=str;
    System.out.print(Lib.charactersNumberCount(strTest));
    assertEquals(Lib.charactersNumberCount(strTest),240000);
    }
    2.单词数统计测试
    public void testWordsNumberCount() {
    String str="hello world myname isjohn ";
    String strTest="";
    for(int i=0;i<10000;i++)
    strTest+=str;

    	System.out.print("
    "+Lib.wordsNumberCount(strTest));
    	assertEquals(40000,Lib.wordsNumberCount(strTest));
    	
    }
    

    3.行数统计测试
    public void testLinesNumberCount() throws IOException {
    String str="helloworld myname isjohn";
    String strTest="";

    	//地址为本地测试文件地址
    	String outPath="D:\\eclipse\\wordcount_java\\src\\wordcount_java\\test.txt";
    	for(int i=0;i<10000;i++)
    		strTest+=str;
    	
    	FileOutputStream fileOutputStream=new FileOutputStream(outPath);
        OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream,"UTF-8");
        BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter);
        bufferedWriter.write(strTest);
    	System.out.print(Lib.linesNumberCount("D:\\eclipse\\wordcount_java\\src\\wordcount_java\\test.txt")+"
    ");
    	assertEquals(19115,Lib.linesNumberCount(outPath));
    	
    }
    

    心路历程

    对于软件的开发有点思路了

  • 相关阅读:
    紫书 习题2-4 子序列的和
    紫书 习题2-3 倒三角形
    HDU 1013 Digital Roots(字符串,大数,九余数定理)
    HDU 1308 What Day Is It?(模拟,日期)
    ACM数论-欧几里得与拓展欧几里得算法
    今日计划
    UVA 10340 All in All(字符串,朴素匹配)
    ACM-字符串
    Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
    Codeforces Round #424 A(模拟)
  • 原文地址:https://www.cnblogs.com/mm220414/p/14612132.html
Copyright © 2020-2023  润新知