编码作业

第二部分

项目地址

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\nmyname\nisjohn";
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 \n myname \n isjohn\n";
String strTest="";
for(int i=0;i<10000;i++)
strTest+=str;

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

3.行数统计测试
public void testLinesNumberCount() throws IOException {
String str="helloworld\nmyname\nisjohn";
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")+"\n");
	assertEquals(19115,Lib.linesNumberCount(outPath));
	
}

心路历程

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

posted on 2021-04-02 18:53  定康荒唐  阅读(65)  评论(0编辑  收藏  举报

导航