wordcount

Posted yzynbone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wordcount相关的知识,希望对你有一定的参考价值。

gitee地址:

https://gitee.com/yzyindex/wordcount

需求分析

通过程序设计,编写一个可执行文件exe能够对源程序文件进行统计字符数、单词数、行数,统计结果可以以指定的格式输出到默认文件中。

可执行程序命名为:wc.exe,该程序处理用户需求的模式为:

wc.exe [parameter] [input_file_name]

基本功能:

wc.exe -c file.c 对字符数的统计

wc.exe -w file.c 对单词数的统计

wc.exe -l file.c 对行数的统计

wc.exe -o result.txt 将结果输出到指定文件result.txt

psp

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 30

 20

· Estimate

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

 100

 70

Development

开发

 700

 1000

· Analysis

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

 200

 90

· Design Spec

· 生成设计文档

 32  

 50

· Design Review

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

 100

 60

· Coding Standard

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

 100

 60

· Design

· 具体设计

 100

 300

· Coding

· 具体编码

 500

 600

· Code Review

· 代码复审

 60

 100

· Test

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

 140

 150

Reporting

报告

 100

 100

· Test Report

· 测试报告

 50

 50

· Size Measurement

· 计算工作量

 30

 50

· Postmortem & Process Improvement Plan

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

 20

 30

 

合计

 2360

 2800

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 --

 

 

 

 

 

 

 

解题思路

--

为了用两个数组分别存取文件名和操作命令,根据是否带有-0指令来采取两种不同的方式输出结果到指定文件和默认文件,每种方式采用循环+switch的方式得到输出信息的字符串str

最终将str输入到指定的文件

代码说明

--

将命令和文件名分离

List<String> operations = new ArrayList<String>();
        List<String> files = new ArrayList<String>();
        String outPutFile ="result.txt";
        for(int i=0 ;i<args.length;i++)
        {
            if(args[i].startsWith("-"))
            operations.add(args[i]);
            else
                files.add(args[i]);
                
        }

 

不带-o命令的操作 通过for+switch取得输出信息str,最终输入到指定文件。

 if(!operations.contains("-o"))
            {
                for (int j= 0; j < files.size(); j++) {
                    switch (operations.get(i)) {
                    case "-c":
                        str+=" "+basicFunction.getCharNum(files.get(j));
                        break;
                    case "-l":
                        str+=" "+basicFunction.getLineNum(files.get(j));
                        break;
                    case "-w":
                        str+=" "+basicFunction.getWordNum(files.get(j));
                        break;
                    default:
                        System.out.println("false");
                        break;
                    }
                }
                outputfile(str,outPutFile);
              
            }

带有-o的操作

else {
                outPutFile=files.get(files.size()-1);
                for (int j= 0; j< files.size()-1; j++) {
                    switch (operations.get(i)) {
                    case "-c":
                        str+=" "+basicFunction.getCharNum(files.get(j));
                        break;
                    case "-l":
                        str+=" "+basicFunction.getLineNum(files.get(j));
                        break;
                    case "-w":
                        str+=" "+basicFunction.getWordNum(files.get(j));
                        break;
                    case "-o" : break;
                    default:
                        System.out.println("false");
                        break;
                    }
                }
                outputfile(str,outPutFile);
            }

获取字符数量,单词数量,行数的函数

public static String getCharNum(String string) throws IOException 
    {
         
          
            BufferedReader buf =Util.getBufferedReader(string);
            String line;
            int charNum = 0;
               while((line = buf.readLine()) != null){
                    char[] ch = line.toCharArray();
                    for(int i=0; i < ch.length; i++) {
                        if(!Character.isWhitespace(ch[i])) {
                            charNum++;
                        }
                    }
                }
                System.out.println("字符数: " + charNum);
                String str="字符数: " + charNum;
                buf.close();
                return str;
            
    }
    public static String getWordNum(String file) throws IOException
    {
    
         int wordNum=0;
          
            int x=-1;
            Reader Reader=Util.getFileReader(file);
            while((x=Reader.read())!=-1)
            {
                char a=(char)x;
                if(a==‘ ‘||a==‘,‘||a==‘.‘)
                {
                    wordNum++;
                }
            }
            Reader.close();
            String str="单词数:"+wordNum;
            System.out.println("单词数:"+wordNum);
            return str;
    }
    public static String getLineNum(String file) throws IOException
    {
             int lineNum=0;
            BufferedReader buf=Util.getBufferedReader(file);
                while(buf.readLine()!=null)
                {
                    lineNum++;
                }
                buf.close();
            String str="行数:"+lineNum;
            
            System.out.println("行数:"+lineNum);
            return str;
    }

工具util类 提供各种的文件操作流

public static BufferedReader getBufferedReader(String file) throws FileNotFoundException {
        File file1 = new File(file);
        BufferedReader buf=null;
        buf = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));
        return buf;
    
    }
    public static InputStream  getInputStream(String file) throws FileNotFoundException {
        File file1 = new File(file);
        InputStream in=null;
        in= new FileInputStream(file1);
        return in;
        
    }
    public static Reader getFileReader(String file) throws FileNotFoundException
    {
        File file1 = new File(file);
        Reader rd= null;
        rd =new FileReader(file1);
        return rd;
    }
    public static BufferedWriter getBufferedWriter(File file) throws FileNotFoundException
    {

        BufferedWriter buf = null;
        buf= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
        return buf;
    }

测试输入:

wc.exe -c fix.txt

wc.exe -c -l fix.txt

wc.exe -c -w -l test.txt

wc.exe -l -c test.txt

wc.exe -c -w test.xt
wc.exe  -c -w -l test.txt

wc.exe  -c --w -c test.txt

wc.exe -l --ww -c test.txt

部分测试截图:

技术分享图片

技术分享图片

 技术分享图片

 

 

技术分享图片

技术分享图片

技术分享图片

 

 

 

经上述测试 程序都能排除错误,但由于时间原因我并没有编写当用户输入错误提示用户重新输入的代码,导致程序存在一些逻辑问题

心得体会:我自以为学了java的很多知识,但是当用的时候才发现,学了当没学!!!也特别是对io的操作,简直是重新学了一遍,本来没有给编码留太多的时间,最后到写时编码花了太多的时间,不过能重新学到新的知识,也算是有收获,不过这也让我下定决心再学一遍代码,边学边敲! 除此之外,这次试验最大的收获便是git了,简直太好用了,我花了一下午+一晚上的时间,掌握了许多命令操作,算是被编码打击后的一些安慰吧。希望老师多出点个人项目,我想多实战一下!!!

有关博客的使用和排版,:http://www.cnblogs.com/math/p/se-tools-001.html。 

    有关Git的使用,廖雪峰的官方网站。 

 


以上是关于wordcount的主要内容,如果未能解决你的问题,请参考以下文章

hadoop之WordCount源代码分析

Hadoop中WordCount代码-直接加载hadoop的配置文件

WordCount代码实现及测试

Hadoop- Wordcount程序原理及代码实现

wordcount代码实现详解

如何运行自带wordcount-Hadoop2