WordCount合作--自己部分

Posted sirpi

tags:

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

 

 

前言:

(1)合作者:201631062127,201631062625

(2)合作代码地址:WordCount

一.结对的PSP表格:

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

60

55

· Estimate

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

1200

900

Development

开发

110

134

· Analysis

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

60

80

· Design Spec

· 生成设计文档

50

70

· Design Review

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

60

100

· Coding Standard

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

60

50

· Design

· 具体设计

100

130

· Coding

· 具体编码

90

120

· Code Review

· 代码复审

30

50

· Test

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

60

50

Reporting

报告

40

60

· Test Report

· 测试报告

30

30

· Size Measurement

· 计算工作量

10

10

· Postmortem & Process Improvement Plan

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

25

25

 

合计

785

934

 

二.代码互审情况:

  相关情况: 相互之间对代码通看了一边,对一些好的全部借鉴下来,不好的全部丢弃。比如整个的程序流程

我们重新构思了一下。

三.设计过程:

  由于我们是用java语言来编写的,当然首先是面向对象吧,我们先分析这个项目中所存在的对象,进而分析其需要包含的变量函数。

当然了,博客上已经明确说明此次项目需求,只需要依次实现相关方法即可。

  流程图:

  技术分享图片

 

  部分运行截图:

 技术分享图片

 

技术分享图片

 

 命令行运行结果:

技术分享图片

目标文件:

技术分享图片

停用词表:

技术分享图片

结果文件:

技术分享图片

 

 通配符递归测试:

技术分享图片

结果:

 技术分享图片

四.代码说明:

  这次代码和前次基础功能差别不是很大,类就多了一个,总的5个类。

  技术分享图片

  说明:

    Main-----------主函数所在类

    Client----------界面类

    Parameter-----------参数存放的类,所有解析的参数命令放入此类

    Resulte--------------结果集放置类,所有的结果集中放置

    WordCount-------------主要函数所在类(计词,行等)

    Tools-------------------工具类,包含需要用到的函数,具有较高的复用性(参数解析,文件的写入与读取)

 

  另外对以前的WordCount进行了重构,源码如下(包含部分注释):

 

Mian:

技术分享图片
 1 import java.io.IOException;
 2 
 3 
 4 public class Main {
 5     //-c   字符数
 6     // -w  词数
 7     // -l  行数
 8     // -o  指定输出文件
 9     // -e  停用词表,接文件名
10     // -a  返回更复杂的数据(代码行 / 空行 / 注释行)
11     // -s  递归处理目录下符合条件的文件,接文件名
12     // -x  调用高级功能
13     //public static final String DEFAULTPARAS[] = {"-c","-w","-l","-o","-e","-a","-s","-x"};//8个
14 
15     public static void main(String[] args) throws IOException {
16         //String canshu = "-w -c -l -a /home/kevin/cb/a.txt -e /home/kevin/s.txt";
17         //canshu = "-x";
18         String canshu = "";
19         canshu = Tools.junctParas(args);
20 
21         //System.out.println(canshu);
22         WordCount wordCount = new WordCount(canshu);
23         wordCount.processFile();
24 
25         //String str = " {}"+System.lineSeparator();
26         //System.out.println(str.replaceAll("[\\s\\{\\}]","6"));
27         //String str = Tools.text2String(new File("/home/kevin/a.txt"));
28         //System.out.println(wordCount.getLineCount(str));
29 
30         //System.out.println(Tools.getRealFileNameFromList("/home/kevin/cb/"));
31 
32         //System.out.println("a*".matches("a..*"));
33     }
34 }
View Code

Client:

技术分享图片
  1 import javax.swing.*;
  2 import java.awt.*;
  3 import java.awt.event.ActionEvent;
  4 import java.awt.event.ActionListener;
  5 import java.io.File;
  6 import java.io.IOException;
  7 
  8 public class Client implements ActionListener {
  9 
 10     /*
 11     * UI相关
 12     * */
 13     private  JButton buttonF = null;
 14     private JButton buttonOK = null;
 15     private JFrame frame = null;
 16     private JTextArea jTextArea = null;
 17     private Container conFile = null;
 18     private Container conResult = null;
 19     private  JLabel jLabel = null;
 20     private JTextField textF = null;
 21     private JFileChooser jFileChooser = null;
 22     private JTabbedPane tabbedPane = null;
 23 
 24     /*
 25     * WordCound 调用参数相关
 26     * */
 27     private File file = null;
 28     private Parameter parameter = null;
 29 
 30     public Client(Parameter parameter){
 31 
 32         this.parameter = parameter;
 33         buttonF = new JButton();
 34         buttonOK = new JButton();
 35         frame = new JFrame("WordCount");
 36         jTextArea = new JTextArea();
 37         conFile=new Container();
 38         conResult=new Container();
 39         jLabel = new JLabel();
 40         textF=new JTextField();
 41         tabbedPane = new JTabbedPane();
 42         jFileChooser = new JFileChooser();
 43 
 44     }
 45 
 46     /**
 47      * @Auther: kevin
 48      * @param
 49      * @return: void
 50      * @Descriptions:
 51      * @date: 18-10-17 下午8:45
 52      */
 53     public void createAndShowGUI() {
 54 
 55         // 确保一个漂亮的外观风格
 56         //JFrame.setDefaultLookAndFeelDecorated(true);
 57 
 58         // 创建及设置窗口
 59         //frame.getContentPane().setBackground(Color.red);
 60         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 61 
 62         /*
 63          *获取屏幕的宽,高
 64          *
 65          * */
 66         double hostL = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
 67         double hostW = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
 68         frame.setLocation((int)(hostL/2-100),(int)(hostW/2-250));//根据面板大小设置面板出现位置
 69         frame.setSize(500,200);//设置整个面板大小
 70         frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
 71 
 72         /*
 73          *添加面板
 74          *
 75          * */
 76         tabbedPane.addTab("chose your file",conFile);
 77         tabbedPane.addTab("results",conResult);
 78 
 79         /*
 80          *设置结果显示文本框
 81          *
 82          * */
 83         jTextArea.setBounds(0,0,500,200);
 84         jTextArea.setLineWrap(true);
 85         //jTextArea.setText("464648564444444444444416555555555555555555555555555555555555555555");
 86         //add to pane
 87         conResult.add(jTextArea);
 88 
 89         /*
 90          * 设置文件选择框
 91          * */
 92         jLabel.setText("file: ");
 93         jLabel.setSize(40,40);
 94         jLabel.setLocation(30,40);
 95         conFile.add(jLabel);
 96 
 97         //文件路径名
 98         textF.setSize(180,25);
 99         textF.setLocation(70,50);
100         conFile.add(textF);
101 
102         //文件选择框
103         jFileChooser.setCurrentDirectory(new File("").getAbsoluteFile());
104         conFile.add(jFileChooser);
105 
106         /*
107          *设置文件选择按钮和确认按钮
108          *
109          * */
110         //文字
111         buttonF.setText("chose");
112         buttonOK.setText("sure");
113         //位置
114         buttonF.setLocation(270,50);
115         buttonOK.setLocation(340,50);
116         //大小
117         buttonF.setSize(50,25);
118         buttonOK.setSize(50,25);
119         //内边距
120         buttonF.setMargin(new Insets(0,0,0,0));
121         buttonOK.setMargin(new Insets(0,0,0,0));
122         //加入pane
123         conFile.add(buttonF);
124         conFile.add(buttonOK);
125         //添加监听
126         buttonF.addActionListener(this);
127         buttonOK.addActionListener(this);
128 
129         frame.add(tabbedPane);
130         // 显示窗口
131         frame.setVisible(true);
132 
133     }
134 
135     @Override
136     public void actionPerformed(ActionEvent actionEvent) {
137 
138         if(actionEvent.getSource().equals(buttonF)) {
139             jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//只选择文件
140             int status = jFileChooser.showOpenDialog(null);//文件选择状态
141 
142             if(status==JFileChooser.CANCEL_OPTION){
143                 return;
144             }else if(JFileChooser.APPROVE_OPTION == status){
145 
146                 file=jFileChooser.getSelectedFile();//选择到的文件
147                 //System.out.println(file.exists());
148                 textF.setText(file.getAbsolutePath());
149             }
150 
151         }else if(actionEvent.getSource().equals(buttonOK)){
152             if(file==null){
153                 // 消息对话框无返回, 仅做通知作用
154                 JOptionPane.showMessageDialog( frame, "File is not exist !!!", "error", JOptionPane.INFORMATION_MESSAGE );
155             }else{
156 
157                 tabbedPane.setSelectedComponent(conResult);
158                 setParameter(parameter ,file);
159                 Result result = new Result();
160                 String textData = Tools.text2String(new File(this.parameter.getInputfileName()));
161                 try {
162                     Tools.setResult(new WordCount(""),parameter,result,textData);
163                 } catch (IOException e) {
164                     e.printStackTrace();
165                 }
166                 //设置显示数据
167                 String sResult= Tools.formatInputData(parameter.getInputfileName(),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
168                 jTextArea.setText(sResult);
169             }
170         }
171     }
172 
173     /**
174      * @Auther: kevin
175      * @param parameter
176     * @param file
177      * @return: void
178      * @Descriptions:
179      * @date: 18-10-17 下午8:44
180      */
181     private void setParameter(Parameter parameter ,File file){
182 
183         parameter.setInputfileName(file.getAbsolutePath());
184         parameter.setShowCharCount(true);
185         parameter.setShowWordCount(true);
186         parameter.setShowlineCount(true);
187         parameter.setShowMore(true);
188     }
189 
190 
191     /*public static void main(String[] args){
192         Client swingUI = new Client();
193         swingUI.createAndShowGUI();
194         int a = 0,b=1;
195         if(a==0){
196             System.out.println("0");
197         }else if(b==1){
198             System.out.println("1");
199         }
200 
201     }*/
202 }
View Code

Parameter:

技术分享图片
  1 import java.util.List;
  2 
  3 public class Parameter {
  4     //-c   字符数
  5     // -W  词数
  6     // -l  行数
  7     // -o  指定输出文件
  8     // -e  停用词表,接文件名
  9     // -a  返回更复杂的数据(代码行 / 空行 / 注释行)
 10     // -s  递归处理目录下符合条件的文件,接文件名
 11     // -x  调用高级功能
 12 
 13     //单文件使用的输入名
 14     private String inputfileName=null;
 15 
 16     //默认输出文件
 17     private String outPutFileName="result.txt";
 18 
 19     //停用词表
 20     private String filterFilename = null;
 21 
 22     //多文件使用
 23     private List<String> filesName = null;
 24 
 25     //是否计算字符数
 26     private boolean isShowCharCount=false;
 27 
 28     //是否计算词数
 29     private boolean isShowWordCount=false;
 30 
 31     //是否计算行数
 32     private boolean isShowlineCount=false;
 33 
 34     //是否有指定输出文件
 35     private boolean isOutput=false;
 36 
 37     //是否用停用词表
 38     private boolean filterWord=false;
 39 
 40     //是否显示更多信息(代码行,注释行,空行)
 41     private boolean isShowMore=false;
 42 
 43     //是否处理多文件,就是递归处理符合条件的文件
 44     private boolean isProcessMultFiles=false;
 45 
 46     //是否启用高级功能,UI界面
 47     private boolean isAdvance=false;
 48 
 49 
 50     public String getInputfileName() {
 51         return inputfileName;
 52     }
 53 
 54     public void setInputfileName(String inputfileName) {
 55         this.inputfileName = inputfileName;
 56     }
 57 
 58     public String getOutPutFileName() {
 59         return outPutFileName;
 60     }
 61 
 62     public void setOutPutFileName(String outPutFileName) {
 63         this.outPutFileName = outPutFileName;
 64     }
 65 
 66     public String getFilterFilename() {
 67         return filterFilename;
 68     }
 69 
 70     public void setFilterFilename(String filterFilename) {
 71         this.filterFilename = filterFilename;
 72     }
 73 
 74     public List<String> getFilesName() {
 75         return filesName;
 76     }
 77 
 78     public void setFilesName(List<String> filesName) {
 79         this.filesName = filesName;
 80     }
 81 
 82     public boolean isShowCharCount() {
 83         return isShowCharCount;
 84     }
 85 
 86     public void setShowCharCount(boolean showCharCount) {
 87         isShowCharCount = showCharCount;
 88     }
 89 
 90     public boolean isShowWordCount() {
 91         return isShowWordCount;
 92     }
 93 
 94     public void setShowWordCount(boolean showWordCount) {
 95         isShowWordCount = showWordCount;
 96     }
 97 
 98     public boolean isShowlineCount() {
 99         return isShowlineCount;
100     }
101 
102     public void setShowlineCount(boolean showlineCount) {
103         isShowlineCount = showlineCount;
104     }
105 
106     public boolean isOutput() {
107         return isOutput;
108     }
109 
110     public void setOutput(boolean output) {
111         isOutput = output;
112     }
113 
114     public boolean isFilterWord() {
115         return filterWord;
116     }
117 
118     public void setFilterWord(boolean filterWord) {
119         this.filterWord = filterWord;
120     }
121 
122     public boolean isShowMore() {
123         return isShowMore;
124     }
125 
126     public void setShowMore(boolean showMore) {
127         isShowMore = showMore;
128     }
129 
130     public boolean isProcessMultFiles() {
131         return isProcessMultFiles;
132     }
133 
134     public void setProcessMultFiles(boolean processMultFiles) {
135         isProcessMultFiles = processMultFiles;
136     }
137 
138     public boolean isAdvance() {
139         return isAdvance;
140     }
141 
142     public void setAdvance(boolean advance) {
143         isAdvance = advance;
144     }
145 }
View Code

Result:

技术分享图片
 1 public class Result {
 2     //处理的文件名
 3     private String inputFileName=null;
 4     //指定输出的文件名
 5     private String outPutFileName=null;
 6 
 7     //字符数
 8     private int charCount=-1;
 9     //词数
10     private int WordCount=-1;
11     //行数
12     private int lineCount=-1;
13 
14     //空行数
15     private int emptyLineCount=-1;
16     //代码行
17     private int codeLineCount=-1;
18     //注释行
19     private int commentLineCount=-1;
20 
21     public String getInputFileName() {
22         return inputFileName;
23     }
24 
25     public void setInputFileName(String inputFileName) {
26         this.inputFileName = inputFileName;
27     }
28 
29     public String getOutPutFileName() {
30         return outPutFileName;
31     }
32 
33     public void setOutPutFileName(String outPutFileName) {
34         this.outPutFileName = outPutFileName;
35     }
36 
37     public int getCharCount() {
38         return charCount;
39     }
40 
41     public void setCharCount(int charCount) {
42         this.charCount = charCount;
43     }
44 
45     public int getWordCount() {
46         return WordCount;
47     }
48 
49     public void setWordCount(int wordCount) {
50         WordCount = wordCount;
51     }
52 
53     public int getLineCount() {
54         return lineCount;
55     }
56 
57     public void setLineCount(int lineCount) {
58         this.lineCount = lineCount;
59     }
60 
61     public int getEmptyLineCount() {
62         return emptyLineCount;
63     }
64 
65     public void setEmptyLineCount(int emptyLineCount) {
66         this.emptyLineCount = emptyLineCount;
67     }
68 
69     public int getCodeLineCount() {
70         return codeLineCount;
71     }
72 
73     public void setCodeLineCount(int codeLineCount) {
74         this.codeLineCount = codeLineCount;
75     }
76 
77     public int getCommentLineCount() {
78         return commentLineCount;
79     }
80 
81     public void setCommentLineCount(int commentLineCount) {
82         this.commentLineCount = commentLineCount;
83     }
84 }
View Code

WordCount:

技术分享图片
  1 import java.io.*;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4 
  5 public class WordCount {
  6 
  7     public Parameter parameter;
  8 
  9     public WordCount(String longparas) throws IOException {
 10         this.parameter = Tools.putParasToParameter(longparas);
 11     }
 12 
 13     /**
 14      * @Auther: kevin
 15      * @param
 16      * @return: void
 17      * @Descriptions:控制整个流程,单个文件处理还是多文件的递归,或者调出UI。
 18      * @date: 18-10-17 下午8:47
 19      */
 20     public void processFile() throws IOException {
 21 
 22         String outPutFile = null;
 23         String inputData = null;
 24         String textData = null;
 25         Result result = null;
 26        if(parameter.isAdvance()){
 27 
 28            Client swingUI = new Client(parameter);
 29            swingUI.createAndShowGUI();
 30 
 31        }else if(parameter.isProcessMultFiles()){
 32 
 33             result = new Result();
 34             //System.out.println("size: "+parameter.getFilesName().size());
 35             for(int i=0;i<parameter.getFilesName().size();i++){
 36 
 37                 textData = Tools.text2String(new File(this.parameter.getFilesName().get(i)));
 38                 Tools.setResult(this,parameter,result,textData);
 39                 outPutFile = result.getOutPutFileName();
 40                 inputData = Tools.formatInputData(this.parameter.getFilesName().get(i),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
 41                 Tools.writeFile(outPutFile,inputData);
 42                 //System.out.println(outPutFile+inputData);
 43             }
 44 
 45         }else{
 46            result = new Result();
 47            textData = Tools.text2String(new File(this.parameter.getInputfileName()));
 48            Tools.setResult(this,parameter,result,textData);
 49            outPutFile = parameter.getOutPutFileName();
 50            inputData = Tools.formatInputData(parameter.getInputfileName(),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
 51            Tools.writeFile(outPutFile,inputData);
 52            //System.out.println(outPutFile+inputData);
 53        }
 54 
 55     }
 56 
 57     /**
 58      * @Auther: kevin
 59      * @param textData
 60      * @return: int
 61      * @Descriptions:获取字符数
 62      * @date: 18-10-17 下午8:47
 63      */
 64     public int getCharCount(String textData){
 65         int ret = -1;
 66         ret = textData.length();
 67         return ret;
 68     }
 69 
 70     /**
 71      * @Auther: kevin
 72      * @param HasStopWords
 73     * @param textData
 74      * @return: int
 75      * @Descriptions:获取词数
 76      * @date: 18-10-17 下午8:46
 77      */
 78     public int getWordCount(boolean HasStopWords,String textData){
 79 
 80         int ret = -1;
 81         String tmp[] = textData.split("\\s+|,+");
 82         List<String> list=new ArrayList<String>();
 83 
 84         for(int i=0;i<tmp.length;i++){
 85             if(!tmp[i].equals(""))
 86                 list.add(tmp[i]);
 87         }
 88 
 89         //对停用词不进行计数
 90         if(HasStopWords){
 91             //File file = new File("/home/kevin/s.txt");
 92             File file = new File(parameter.getFilterFilename());
 93             String stopWord = Tools.text2String(file);
 94             String stopWords[] = stopWord.split("\\s+");
 95             for(int i=0;i<stopWords.length;i++){
 96                 for(int j=0;j<list.size();j++){
 97                     if(stopWords[i].equalsIgnoreCase(list.get(j))){
 98                         //System.out.println(list.get(j));
 99                         list.remove(j);
100                         j--;
101                     }
102                 }
103             }
104         }
105 
106         ret = list.size();
107 
108         return ret;
109     }
110 
111     /**
112      * @Auther: kevin
113      * @param textData
114      * @return: int
115      * @Descriptions:获取行数
116      * @date: 18-10-17 下午8:46
117      */
118     public int getLineCount(String textData){
119 
120         int ret = -1;
121         ret = textData.split(System.lineSeparator()).length;
122         return ret;
123     }
124 
125     /**
126      * @Auther: kevin
127      * @param textData
128      * @return: int
129      * @Descriptions:获取空行数
130      * @date: 18-10-17 下午8:46
131      */
132     public int getEmptyLineCount(String textData){
133 
134         int ret = 0;
135         String tmp[] = textData.split(System.lineSeparator());
136         for(int i=0;i<tmp.length;i++){
137             if(tmp[i].replaceAll("[\\s\\{\\}]","").equals(""))
138                 ret++;
139         }
140         return ret;
141     }
142 
143     /**
144      * @Auther: kevin
145      * @param textData
146      * @return: int
147      * @Descriptions:获取代码行数
148      * @date: 18-10-17 下午8:46
149      */
150 
151     public int getCodeLineCount(String textData){
152         int ret = 0;
153         String tmp[] = textData.split(System.lineSeparator());
154         ret = getLineCount(textData)-getCommentLineCount(textData)-getEmptyLineCount(textData);
155         return ret;
156 
157     }
158 
159     /**
160      * @Auther: kevin
161      * @param textData
162      * @return: int
163      * @Descriptions:获取注释行数
164      * @date: 18-10-17 下午8:49
165      */
166     public int getCommentLineCount(String textData){
167 
168         int ret = 0;
169         String tmp[] = textData.split(System.lineSeparator());
170         for(int i=0;i<tmp.length;i++){
171             if(tmp[i].contains("//"))
172                 ret++;
173         }
174         return ret;
175     }
176 }
View Code

Tools:

技术分享图片
  1 import java.io.*;
  2 import java.util.ArrayList;
  3 import java.util.List;
  4 
  5 public class Tools{
  6     //-c   字符数
  7     // -W  词数
  8     // -l  行数
  9     // -o  指定输出文件
 10     // -e  停用词表,接文件名
 11     // -a  返回更复杂的数据(代码行 / 空行 / 注释行)
 12     // -s  递归处理目录下符合条件的文件,接文件名
 13     // -x  调用高级功能
 14     public static final String DEFAULTPARAS[] = {"-c","-w","-l","-o","-e","-a","-s","-x"};//8个
 15 
 16     /*
 17     *
 18     * 将数组参数连接为字符串
 19     * */
 20     public static String junctParas(String args[]){
 21         String junction = "";
 22 
 23         for(int i=0;i<args.length;i++){
 24             junction += args[i]+" ";
 25             //System.out.println(args[i]);
 26         }
 27 
 28         return junction.trim();
 29     }
 30 
 31     /*
 32     * 将参数放进parameter
 33     *
 34     * */
 35     public static  Parameter putParasToParameter(String longParas){
 36         String opt = null;
 37         String realParas[] = getRealParas(longParas);
 38         Parameter parameter = new Parameter();
 39 
 40         for(int i=0;i<realParas.length;i++){
 41             opt = realParas[i];
 42             switch (opt){
 43                 case "-c":
 44                     parameter.setShowCharCount(true);
 45                     break;
 46                 case "-w":
 47                     parameter.setShowWordCount(true);
 48                     break;
 49                 case "-l":
 50                     parameter.setShowlineCount(true);
 51                     break;
 52                 case "-o":
 53                     parameter.setOutput(true);
 54                     parameter.setOutPutFileName(getFileName("-o",longParas));
 55                     //System.out.println(parameter.getOutPutFileName());
 56                     break;
 57                 case "-e":
 58                     parameter.setFilterWord(true);
 59                     parameter.setFilterFilename(getFileName("-e",longParas));
 60                     break;
 61                 case "-a":
 62                     parameter.setShowMore(true);
 63                     break;
 64                 case "-s":
 65                     parameter.setProcessMultFiles(true);
 66                     parameter.setFilesName(getRealFileNameFromList(getFileName("-s",longParas)));
 67                     break;
 68                 case "-x":
 69                     parameter.setAdvance(true);
 70                     break;
 71                     default:
 72             }
 73         }
 74         parameter.setInputfileName(getInputFileName(longParas));
 75 
 76         return parameter;
 77     }
 78     /*
 79     *
 80     * 解析真实的命令参数
 81     * */
 82     private static String[] getRealParas(String longParas){
 83         String tmp[] = longParas.split(" ");
 84         List<String> realPara=new ArrayList<String>();
 85         for(int i=0;i<tmp.length;i++){
 86             for(int j=0;j<DEFAULTPARAS.length;j++){
 87                 if( tmp[i].trim().equals(DEFAULTPARAS[j]) ){
 88                     realPara.add(tmp[i]);
 89                 }
 90             }
 91         }
 92 
 93         return (String[])realPara.toArray(new String[realPara.size()]);
 94     }
 95 
 96     //String canshu="-c e:\\test.txt -W -l -o -s -e file.txt";
 97     /*
 98     * 基础功能,单个输入文件名获取
 99     *
100     * */
101     private static String getInputFileName(String longParas){
102        String inputFileName = null;
103        String tmp[] = longParas.split(" ");
104        for(int i=0;i<DEFAULTPARAS.length;i++){
105            for(int j=0;j<tmp.length;j++){
106                if(!DEFAULTPARAS[i].equals(tmp[j]) && tmp[j].length()>2 ){
107                    //System.out.println(tmp[j]+" "+DEFAULTPARAS[i]);
108                    if( !tmp[j].equals(getFileName("-o",longParas)) && !tmp[j].equals(getFileName("-e",longParas)) && !tmp[j].equals(getFileName("-s",longParas))){
109                        //System.out.println(getFileName("-o",longParas)+getFileName("-e",longParas)+getFileName("-s",longParas));
110                        inputFileName = tmp[j];
111                    }
112                }
113            }
114        }
115 
116         return inputFileName;
117     }
118 
119     /*
120     *
121     * 通过命令参数获取 所需文件,如: 停用词表,输出文件
122     *
123     * */
124     private static String getFileName(String para,String paras){
125         boolean isNewFile = paras.contains(para);
126         String newFileName = null;
127         String str[] = paras.substring(paras.indexOf(para)+3).split(" ");
128         if(isNewFile){ newFileName = str[0];}
129         return newFileName;
130     }
131 
132     /*
133     * 筛选需要用到的文件,递归做匹配相应的文件.
134     *
135     * */
136     public static List<String> getRealFileNameFromList(String filePath){
137         String processedFile = getProcessedFileName(filePath);
138         String diviPath[] = getFileNameFormPath(filePath);
139 
140         List<String> fileList = getFileNameFromDir(new File(diviPath[0]));
141         for(int i=0;i<fileList.size();i++){
142             //System.out.println(fileList.size());
143             String fileName = getFileNameFormPath(fileList.get(i))[1];
144             //System.out.println(diviPath[0]+" "+processedFile);
145             if(!fileName.matches(processedFile) && !diviPath[0].equals(processedFile)){//当文件名匹配不成功成功时,移除不符合规则文件
146                 fileList.remove(i);
147                 i--;
148             }
149         }
150 
151         return fileList;
152     }
153 
154     /*
155     *
156     * 对文件名进行通配符解释
157     *
158     * */
159     private static String getProcessedFileName(String filePath){
160 
161         String file[] = getFileNameFormPath(filePath);
162         file[1] = file[1].replace("*",".*");//匹配任意一个或多个字符
163         file[1] = file[1].replace("?",".{1,1}");//匹配任意一个字符
164         //file[1] = file[0]+file[1];
165         //System.out.println(file[0]+"6"+file[1]);
166         return file[1];
167     }
168 
169     /*
170     *
171     * 从路径中分离文件名和文件夹名,数组索引0为文件夹,数组索引1为文件
172     * */
173     private static String[] getFileNameFormPath(String filePath){
174         String ret[] = new String[2];
175         if(filePath.contains("/")){
176             int index = filePath.lastIndexOf("/");
177             int len = filePath.length();
178 
179             ret[0] = filePath;
180             ret[1] = filePath;
181 
182             if(len != index+1){
183                 String tmp = filePath.substring(index+1);
184                 if(tmp.matches(".*\\.\\S*")) {
185                     ret[0] = filePath.substring(0, index + 1);
186                     ret[1] = filePath.substring(index + 1);
187                 }
188             }
189         }else{
190             File directory = new File("");
191             ret[0] = directory.getAbsolutePath();
192             ret[1] = filePath;
193         }
194         return ret;
195     }
196 
197     /*
198     *
199     * 获取文件件下面所有文件
200     * */
201     private static List<String> getFileNameFromDir(File file){
202         List<String> fileList = new ArrayList<String>();
203         addFileNameToList(file,fileList);
204         return fileList;
205     }
206 
207     /*
208     *
209     * 通过递归把文件加入List
210     * */
211     private static void addFileNameToList(File file, List<String> fileList){
212 
213         //System.out.println(file);
214         File files[] = file.listFiles();
215 
216         if(files!=null) {
217             for (int i = 0; i < files.length; i++) {
218                 //System.out.println(files.length);
219                 if (files[i].isFile()) {
220 
221                     fileList.add(files[i].toString());
222 
223                 } else if (files[i].isDirectory()) {
224 
225                     File tmp = new File(files[i].toString());
226                     addFileNameToList(tmp, fileList);
227 
228                 }
229             }
230         }
231     }
232 
233     /*
234     *
235     * 从文件中读取数据转换为String类型数据
236     * */
237     public static String text2String(File file){
238         if(!file.exists())return null;
239         StringBuilder result = new StringBuilder();
240 
241         try{
242             BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
243             String s = null;
244             while((s = br.readLine())!=null){//使用readLine方法,一次读一行
245 
246                 result.append(s+System.lineSeparator());
247                 //System.out.println("+");
248             }
249             br.close();
250         }catch(Exception e){
251             e.printStackTrace();
252         }
253         return result.toString();
254     }
255 
256     /*
257     *
258     * 对所有结果进行统一设置
259     * */
260     public static void setResult(WordCount wordCount,Parameter parameter,Result result,String textData){
261 
262         //System.out.println(wordCount);
263         //字符计数
264         if(parameter.isShowCharCount()){ result.setCharCount(wordCount.getCharCount(textData)); }
265         //词数计数
266         //System.out.println(result);
267         if(parameter.isShowWordCount()){ result.setWordCount(wordCount.getWordCount(parameter.isFilterWord(),textData)); }
268 
269         //总行计数
270         if(parameter.isShowlineCount()){ result.setLineCount(wordCount.getLineCount(textData)); }
271 
272         //代码行,注释行,空行计数
273         if(parameter.isShowMore()){
274             result.setCodeLineCount(wordCount.getCodeLineCount(textData));
275             result.setCommentLineCount(wordCount.getCommentLineCount(textData));
276             result.setEmptyLineCount(wordCount.getEmptyLineCount(textData));
277         }
278         //输出文件名
279         if(parameter.isOutput()) result.setOutPutFileName(parameter.getOutPutFileName());
280         else result.setOutPutFileName("result.txt");
281     }
282 
283     /*
284     *
285     * 格式化输出结果
286     * */
287     public static String formatInputData(String fileName,int charCount,int wordCount,int lineCount,int codeLineCount,int commentLineCount,int emptyLineCount){
288         String ret = "文件名路径: "+fileName+" 字符数: "+ String.valueOf(charCount)+" 词数: "+String.valueOf(wordCount)+" 总行数: "+String.valueOf(lineCount)+" 代码行数: "+String.valueOf(codeLineCount)+" 注释行数: "+String.valueOf(commentLineCount)+" 空行数:"+String.valueOf(emptyLineCount);
289         return ret;
290     }
291 
292     /*
293     *
294     * 将数据写入文件
295     * */
296     public static void writeFile(String fileName,String data){
297         File file = new File(fileName);// 要写入的文件路径
298         if (!file.exists()) {// 判断文件是否存在
299             try {
300                 file.createNewFile();// 如果文件不存在创建文件
301                 System.out.println("文件"+file.getName()+"不存在已为您创建!");
302             } catch (IOException e) {
303                 System.out.println("创建文件异常!");
304                 e.printStackTrace();
305             }
306         } else {
307             System.out.println("文件"+file.getName()+"已存在!");
308         }
309 
310 
311         FileOutputStream fos = null;
312         PrintStream ps = null;
313         try {
314             fos = new FileOutputStream(file,true);// 文件输出流    追加
315             ps = new PrintStream(fos);
316         } catch (FileNotFoundException e) {
317             e.printStackTrace();
318         }
319         String string  = data+"
";// +换行
320         ps.print(string); // 执行写操作
321         ps.close();    // 关闭流
322 
323         System.out.println("文件写入完毕!");
324     }
325 }
View Code

另外单元测试,也做了相应的函数测试:

界面:

技术分享图片

Tools(太多就贴两张图):

技术分享图片

技术分享图片

WordCount(太多就贴两张图):

 技术分享图片

技术分享图片

五.总结:

  这次结对编程给我很大的影响。首先通过这次作业学到的不仅仅是编程的部分,合作也是之间相互协调很重要。

另外在讨论中我们都能相互学习到对方不了解的领域。另外编程部分了解一些工具的使用,学会一点皮毛的单元测

试,一些编码规范也同时了解到一些。

  这次编码不是时间用的最多的,反而是两个人之间代码相互融合,以及对函数的缺陷的修改。当然此次项目的

结果还是有很多bug的,所以再之后我们还会抽时间继续完善一些函数,另外做到优化性能。这次合作项目只是

简单的开始,”路漫漫其修远兮,吾将上下而求索“。此后的时间里我会更加注重基础,因在这个项目中给我影响最

大是java自带的函数之强大,让我感受到了算法之美!!!ps:贴上自己的WordCount

以上是关于WordCount合作--自己部分的主要内容,如果未能解决你的问题,请参考以下文章

对wordcount单词字母部分的修改

Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)

AJAX相关JS代码片段和部分浏览器模型

VIM 代码片段插件 ultisnips 使用教程

hadoop之WordCount源代码分析

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