WordCount结对项目

 

1.本次作业

合作者:201631062531,201631062111

码云地址:https://gitee.com/zhuyao1/workCount

作业链接地址:https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188

2.PSP表格

PSP2.1表格

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 20

15

· Estimate

· 估计这个任务需要多少时间

 10

10

Development

开发

 300  

 360

· Analysis

· 需求分析 (包括学习新技术)

 90

 80

· Design Spec

· 生成设计文档

10   

20

· Design Review

· 设计复审 (和同事审核设计文档)

 20 

 10

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 15

 15

· Design

· 具体设计

 30

40

· Coding

· 具体编码

 240   

 300

· Code Review

· 代码复审

 30

 20

· Test

· 测试(自我测试,修改代码,提交修改)

 30

 20

Reporting

报告

 10

 10

· Test Report

· 测试报告

 20  

 10

· Size Measurement

· 计算工作量

20 

 15

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 30

 

合计

 875

955

3.代码互省

我们一开始在做扩展功能之前我们就开始了代码互省,主要针对的是两个人之前写的基本功能的代码进行检查,基本功能的查询行数,单词数,字符数的检查,两个人因为代码的编程思想有所不同,所以在实现功能的时候也有许多不一样,还有个人的习惯,导致一些代码的可读性较差,或者复用率较高。看了代码我们,决定使用相同的编程规范,主要参考了阿里巴巴的java编程手册,对之前的代码进行修改,写之后的扩展功能时也会遵守规范。在之后的扩展功能的编程上,我们主要是互相监督和督促吧,两个人一人写一些,在遇到问题也会讨论,或者在看到他的一些不足也会指出,两个人相辅相成完成项目。

4.设计过程

功能类:

WordCount结对项目_第1张图片

 

界面类:

主函数类:

测试类:

这次是第二次来完成作业,主要是在之前的基础上,添加了一些扩展功能,和高级功能,所以我会借用之前的功能类,并在其中加入自己的新的功能,主要是三个扩展功能和一个高级功能,通过主函数的调用,就可以实现对文件的各种操作。功能类中有6个函数,可供实现功能。主函数类中有三个函数,主函数,功能选择函数和结果输出函数。界面类则是在设置各种控件。

5.代码说明

主要是对扩展功能的说明:

对复杂行数的统计

public String count_moreLine(String filename) throws IOException// 返回各种行数
    {
        int noteLine=0;
        // 注释行
        int emptyLine=0;
        // 空行
        int codeLine=0;
        // 代码行
        int sumLine=0;
        int tag=0;
        // 设置标记,记录多行注释时的注释代码行数
        File file=new File(filename);
        BufferedReader bReader=new BufferedReader(new FileReader(file));
        String s;
        while((s=bReader.readLine())!=null){
            sumLine++;
            if(s.isEmpty()||s.startsWith("{")&&s.endsWith("{")||s.startsWith("}")&&s.endsWith("}")){
                // 对空行的判断
                emptyLine++;
            }
            if(tag==0){
                if(s.contains("//")){
                    // 判断注释符
                    noteLine++;
                }else if(s.contains("/*")){
                    noteLine++;
                    tag=1;
                }
                
            }else {
                noteLine++;
                if(s.contains("*/")){
                    //判断下一行是否有下一个注释符
                 tag=0;
                }
            }
        }
        bReader.close();
        codeLine=sumLine-emptyLine-noteLine;
        String result=filename+",注释行:"+noteLine+",空行数:"+emptyLine+",代码行:"+codeLine;
        return result;
    }

递归对文件的查询

public String recursiveFindFile(String filepath) throws IOException//递归
    {
    
        String result=null;
        File file=new File(filepath);
        if(file.isDirectory()){
            File[] files=file.listFiles();
            if(files.length==0)
            {
                System.out.println("空目录");
            }else{
                for(File f : files)
                {
                    if(f.isDirectory())
                        // 判断是否为目录
                    {
                        recursiveFindFile(f.getPath());
                    }else if(f.isFile()) {
                        // 判断是否为文件
                                 result+="\n文件名:"+f.getPath()+"\n"+count_word(f.getPath())+
                                "\n"+count_line(f.getPath())+
                                "\n"+count_char(f.getPath())+
                                "\n"+count_moreLine(f.getPath());
                    }
                }
            }
        }else if(file.isFile()){
            // 判断是否直接就为文件
            result="文件名:"+filepath+"\n"+count_word(filepath)+
                    "\n"+count_line(filepath)+
                    "\n"+count_char(filepath)+
                    "\n"+count_moreLine(filepath);
        }
        return result;
    }

使用停词表查询

 public int stopWordList(String pathname,String stopList_filepath) throws IOException
        {  
                count_word(pathname);
                // 设置两个临时变量,strs和strs2用于对停词表里面的数据进行判断
                String strs ="";
                String strs2="";
                // 设置num用于统计文本文件和停词表中单词的数量
                int num=0;
                // contentTxt(pathname," ")返回的是对象结果集的变量,对两个结果集进行遍历,返回及结果
                for(Object ob2:contentTxt(pathname," ")) 
                {   
                    //文本文件中的单词数据,放到strs中
                    strs = (String)ob2; 
                    for(Object ob: contentTxt(stopList_filepath, " "))
                    {
                    // 停词表文件中的单词数据,放到strs2中
                    strs2 = (String)ob;
                    // 判断两个strs是否相等,相等就统计次数
                    if(strs.equals(strs2))
                            num++;
                    }        
                }
                wordnum=wordnum-num;
                return wordnum;
            }

界面类的代码说明

public wcUI(){
        
        JFrame jUI=new JFrame("查询工具");
        JPanel jPanel =new JPanel();
        jPanel.setLayout(null);
        jPanel.setBorder(BorderFactory.createTitledBorder("用户专属"));
        
        final JTextField showpath=new JTextField();//用于展示所查文件的路径
        final JTextArea showresult=new JTextArea();//展示结果
        JButton selectfile=new JButton("选择文件");//出发文件选择器
        JButton select=new JButton("查询");//执行查询功能
        final JTextField showstop=new JTextField();//展示停词表文件路径
        JButton selectstop=new JButton("停词表");//选择停词表
                ...        
selectfile.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                //展示文件的路径
                JFileChooser jFileChooser=new JFileChooser("选择文件");
                jFileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
                jFileChooser.showOpenDialog(null);//显示文件选择器
                if(jFileChooser.getSelectedFile().getPath()!=null)
                {
                    showpath.setText(jFileChooser.getSelectedFile().getPath());
                }
                else{
                    System.out.println("没有选择文件");
                }
            }
        });
select.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                workCount wCount=new workCount();
                //根据复选框,选择功能并执行,返回结果
                try {
                        if(command1.isSelected()){
                            result+="\n"+wCount.count_char(showpath.getText());
                        }
                        if(command2.isSelected()){
                            result+="\n"+wCount.count_word(showpath.getText());
                        }
                        if(command3.isSelected()){
                            result+="\n"+wCount.count_line(showpath.getText());
                        }
                        if(command4.isSelected()){
                            result+="\n"+wCount.count_moreLine(showpath.getText());
                        }
                        if(command5.isSelected()){
                            result+="\n使用停词表后,单词数为:"+wCount.stopWordList(showpath.getText(), showstop.getText());
                        }
                        showresult.setText(result);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                
            }
        });
}

6.效果展示

 WordCount结对项目_第2张图片

停词表:

 

访问目录,查询所有文件:

WordCount结对项目_第3张图片

选择查询,复杂行数:

WordCount结对项目_第4张图片

启动图形化界面:

WordCount结对项目_第5张图片

普通查询结果:

WordCount结对项目_第6张图片

 使用停词表:

 WordCount结对项目_第7张图片

 

7.总结

我觉得这次的结对项目让我收获了很多,编程不是一个人的事,我们需要与人合作,结对编程就给了我们这个机会。结对不仅仅是两个人编程那么简单,这更是两个人进步的机会,两个人都有各自编程的想法,在结对的过程,另一个人更可以让一个人产生自己以前没有的编程思路,有好,有坏,但在一次次的讨论中都会有较好的解决方法,两个人相辅相成,在各自学习中完成项目。对于1+1>2?我觉得不是这么简单的,这不是翻倍的收获,更是多与翻倍的收获,对于以后的工作也十分的有帮助。

同伴链接:

https://www.cnblogs.com/zhengzhibin/p/9805504.html

 

你可能感兴趣的:(WordCount结对项目)