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:
import java.io.IOException; public class Main {
//-c 字符数
// -w 词数
// -l 行数
// -o 指定输出文件
// -e 停用词表,接文件名
// -a 返回更复杂的数据(代码行 / 空行 / 注释行)
// -s 递归处理目录下符合条件的文件,接文件名
// -x 调用高级功能
//public static final String DEFAULTPARAS[] = {"-c","-w","-l","-o","-e","-a","-s","-x"};//8个 public static void main(String[] args) throws IOException {
//String canshu = "-w -c -l -a /home/kevin/cb/a.txt -e /home/kevin/s.txt";
//canshu = "-x";
String canshu = "";
canshu = Tools.junctParas(args); //System.out.println(canshu);
WordCount wordCount = new WordCount(canshu);
wordCount.processFile(); //String str = " {}"+System.lineSeparator();
//System.out.println(str.replaceAll("[\\s\\{\\}]","6"));
//String str = Tools.text2String(new File("/home/kevin/a.txt"));
//System.out.println(wordCount.getLineCount(str)); //System.out.println(Tools.getRealFileNameFromList("/home/kevin/cb/")); //System.out.println("a*".matches("a..*"));
}
}
Client:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException; public class Client implements ActionListener { /*
* UI相关
* */
private JButton buttonF = null;
private JButton buttonOK = null;
private JFrame frame = null;
private JTextArea jTextArea = null;
private Container conFile = null;
private Container conResult = null;
private JLabel jLabel = null;
private JTextField textF = null;
private JFileChooser jFileChooser = null;
private JTabbedPane tabbedPane = null; /*
* WordCound 调用参数相关
* */
private File file = null;
private Parameter parameter = null; public Client(Parameter parameter){ this.parameter = parameter;
buttonF = new JButton();
buttonOK = new JButton();
frame = new JFrame("WordCount");
jTextArea = new JTextArea();
conFile=new Container();
conResult=new Container();
jLabel = new JLabel();
textF=new JTextField();
tabbedPane = new JTabbedPane();
jFileChooser = new JFileChooser(); } /**
* @Auther: kevin
* @param
* @return: void
* @Descriptions:
* @date: 18-10-17 下午8:45
*/
public void createAndShowGUI() { // 确保一个漂亮的外观风格
//JFrame.setDefaultLookAndFeelDecorated(true); // 创建及设置窗口
//frame.getContentPane().setBackground(Color.red);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /*
*获取屏幕的宽,高
*
* */
double hostL = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double hostW = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation((int)(hostL/2-100),(int)(hostW/2-250));//根据面板大小设置面板出现位置
frame.setSize(500,200);//设置整个面板大小
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); /*
*添加面板
*
* */
tabbedPane.addTab("chose your file",conFile);
tabbedPane.addTab("results",conResult); /*
*设置结果显示文本框
*
* */
jTextArea.setBounds(0,0,500,200);
jTextArea.setLineWrap(true);
//jTextArea.setText("464648564444444444444416555555555555555555555555555555555555555555");
//add to pane
conResult.add(jTextArea); /*
* 设置文件选择框
* */
jLabel.setText("file: ");
jLabel.setSize(40,40);
jLabel.setLocation(30,40);
conFile.add(jLabel); //文件路径名
textF.setSize(180,25);
textF.setLocation(70,50);
conFile.add(textF); //文件选择框
jFileChooser.setCurrentDirectory(new File("").getAbsoluteFile());
conFile.add(jFileChooser); /*
*设置文件选择按钮和确认按钮
*
* */
//文字
buttonF.setText("chose");
buttonOK.setText("sure");
//位置
buttonF.setLocation(270,50);
buttonOK.setLocation(340,50);
//大小
buttonF.setSize(50,25);
buttonOK.setSize(50,25);
//内边距
buttonF.setMargin(new Insets(0,0,0,0));
buttonOK.setMargin(new Insets(0,0,0,0));
//加入pane
conFile.add(buttonF);
conFile.add(buttonOK);
//添加监听
buttonF.addActionListener(this);
buttonOK.addActionListener(this); frame.add(tabbedPane);
// 显示窗口
frame.setVisible(true); } @Override
public void actionPerformed(ActionEvent actionEvent) { if(actionEvent.getSource().equals(buttonF)) {
jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//只选择文件
int status = jFileChooser.showOpenDialog(null);//文件选择状态 if(status==JFileChooser.CANCEL_OPTION){
return;
}else if(JFileChooser.APPROVE_OPTION == status){ file=jFileChooser.getSelectedFile();//选择到的文件
//System.out.println(file.exists());
textF.setText(file.getAbsolutePath());
} }else if(actionEvent.getSource().equals(buttonOK)){
if(file==null){
// 消息对话框无返回, 仅做通知作用
JOptionPane.showMessageDialog( frame, "File is not exist !!!", "error", JOptionPane.INFORMATION_MESSAGE );
}else{ tabbedPane.setSelectedComponent(conResult);
setParameter(parameter ,file);
Result result = new Result();
String textData = Tools.text2String(new File(this.parameter.getInputfileName()));
try {
Tools.setResult(new WordCount(""),parameter,result,textData);
} catch (IOException e) {
e.printStackTrace();
}
//设置显示数据
String sResult= Tools.formatInputData(parameter.getInputfileName(),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
jTextArea.setText(sResult);
}
}
} /**
* @Auther: kevin
* @param parameter
* @param file
* @return: void
* @Descriptions:
* @date: 18-10-17 下午8:44
*/
private void setParameter(Parameter parameter ,File file){ parameter.setInputfileName(file.getAbsolutePath());
parameter.setShowCharCount(true);
parameter.setShowWordCount(true);
parameter.setShowlineCount(true);
parameter.setShowMore(true);
} /*public static void main(String[] args){
Client swingUI = new Client();
swingUI.createAndShowGUI();
int a = 0,b=1;
if(a==0){
System.out.println("0");
}else if(b==1){
System.out.println("1");
} }*/
}
Parameter:
import java.util.List; public class Parameter {
//-c 字符数
// -W 词数
// -l 行数
// -o 指定输出文件
// -e 停用词表,接文件名
// -a 返回更复杂的数据(代码行 / 空行 / 注释行)
// -s 递归处理目录下符合条件的文件,接文件名
// -x 调用高级功能 //单文件使用的输入名
private String inputfileName=null; //默认输出文件
private String outPutFileName="result.txt"; //停用词表
private String filterFilename = null; //多文件使用
private List<String> filesName = null; //是否计算字符数
private boolean isShowCharCount=false; //是否计算词数
private boolean isShowWordCount=false; //是否计算行数
private boolean isShowlineCount=false; //是否有指定输出文件
private boolean isOutput=false; //是否用停用词表
private boolean filterWord=false; //是否显示更多信息(代码行,注释行,空行)
private boolean isShowMore=false; //是否处理多文件,就是递归处理符合条件的文件
private boolean isProcessMultFiles=false; //是否启用高级功能,UI界面
private boolean isAdvance=false; public String getInputfileName() {
return inputfileName;
} public void setInputfileName(String inputfileName) {
this.inputfileName = inputfileName;
} public String getOutPutFileName() {
return outPutFileName;
} public void setOutPutFileName(String outPutFileName) {
this.outPutFileName = outPutFileName;
} public String getFilterFilename() {
return filterFilename;
} public void setFilterFilename(String filterFilename) {
this.filterFilename = filterFilename;
} public List<String> getFilesName() {
return filesName;
} public void setFilesName(List<String> filesName) {
this.filesName = filesName;
} public boolean isShowCharCount() {
return isShowCharCount;
} public void setShowCharCount(boolean showCharCount) {
isShowCharCount = showCharCount;
} public boolean isShowWordCount() {
return isShowWordCount;
} public void setShowWordCount(boolean showWordCount) {
isShowWordCount = showWordCount;
} public boolean isShowlineCount() {
return isShowlineCount;
} public void setShowlineCount(boolean showlineCount) {
isShowlineCount = showlineCount;
} public boolean isOutput() {
return isOutput;
} public void setOutput(boolean output) {
isOutput = output;
} public boolean isFilterWord() {
return filterWord;
} public void setFilterWord(boolean filterWord) {
this.filterWord = filterWord;
} public boolean isShowMore() {
return isShowMore;
} public void setShowMore(boolean showMore) {
isShowMore = showMore;
} public boolean isProcessMultFiles() {
return isProcessMultFiles;
} public void setProcessMultFiles(boolean processMultFiles) {
isProcessMultFiles = processMultFiles;
} public boolean isAdvance() {
return isAdvance;
} public void setAdvance(boolean advance) {
isAdvance = advance;
}
}
Result:
public class Result {
//处理的文件名
private String inputFileName=null;
//指定输出的文件名
private String outPutFileName=null; //字符数
private int charCount=-1;
//词数
private int WordCount=-1;
//行数
private int lineCount=-1; //空行数
private int emptyLineCount=-1;
//代码行
private int codeLineCount=-1;
//注释行
private int commentLineCount=-1; public String getInputFileName() {
return inputFileName;
} public void setInputFileName(String inputFileName) {
this.inputFileName = inputFileName;
} public String getOutPutFileName() {
return outPutFileName;
} public void setOutPutFileName(String outPutFileName) {
this.outPutFileName = outPutFileName;
} public int getCharCount() {
return charCount;
} public void setCharCount(int charCount) {
this.charCount = charCount;
} public int getWordCount() {
return WordCount;
} public void setWordCount(int wordCount) {
WordCount = wordCount;
} public int getLineCount() {
return lineCount;
} public void setLineCount(int lineCount) {
this.lineCount = lineCount;
} public int getEmptyLineCount() {
return emptyLineCount;
} public void setEmptyLineCount(int emptyLineCount) {
this.emptyLineCount = emptyLineCount;
} public int getCodeLineCount() {
return codeLineCount;
} public void setCodeLineCount(int codeLineCount) {
this.codeLineCount = codeLineCount;
} public int getCommentLineCount() {
return commentLineCount;
} public void setCommentLineCount(int commentLineCount) {
this.commentLineCount = commentLineCount;
}
}
WordCount:
import java.io.*;
import java.util.ArrayList;
import java.util.List; public class WordCount { public Parameter parameter; public WordCount(String longparas) throws IOException {
this.parameter = Tools.putParasToParameter(longparas);
} /**
* @Auther: kevin
* @param
* @return: void
* @Descriptions:控制整个流程,单个文件处理还是多文件的递归,或者调出UI。
* @date: 18-10-17 下午8:47
*/
public void processFile() throws IOException { String outPutFile = null;
String inputData = null;
String textData = null;
Result result = null;
if(parameter.isAdvance()){ Client swingUI = new Client(parameter);
swingUI.createAndShowGUI(); }else if(parameter.isProcessMultFiles()){ result = new Result();
//System.out.println("size: "+parameter.getFilesName().size());
for(int i=0;i<parameter.getFilesName().size();i++){ textData = Tools.text2String(new File(this.parameter.getFilesName().get(i)));
Tools.setResult(this,parameter,result,textData);
outPutFile = result.getOutPutFileName();
inputData = Tools.formatInputData(this.parameter.getFilesName().get(i),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
Tools.writeFile(outPutFile,inputData);
//System.out.println(outPutFile+inputData);
} }else{
result = new Result();
textData = Tools.text2String(new File(this.parameter.getInputfileName()));
Tools.setResult(this,parameter,result,textData);
outPutFile = parameter.getOutPutFileName();
inputData = Tools.formatInputData(parameter.getInputfileName(),result.getCharCount(),result.getWordCount(),result.getLineCount(),result.getCodeLineCount(),result.getCommentLineCount(),result.getEmptyLineCount());
Tools.writeFile(outPutFile,inputData);
//System.out.println(outPutFile+inputData);
} } /**
* @Auther: kevin
* @param textData
* @return: int
* @Descriptions:获取字符数
* @date: 18-10-17 下午8:47
*/
public int getCharCount(String textData){
int ret = -1;
ret = textData.length();
return ret;
} /**
* @Auther: kevin
* @param HasStopWords
* @param textData
* @return: int
* @Descriptions:获取词数
* @date: 18-10-17 下午8:46
*/
public int getWordCount(boolean HasStopWords,String textData){ int ret = -1;
String tmp[] = textData.split("\\s+|,+");
List<String> list=new ArrayList<String>(); for(int i=0;i<tmp.length;i++){
if(!tmp[i].equals(""))
list.add(tmp[i]);
} //对停用词不进行计数
if(HasStopWords){
//File file = new File("/home/kevin/s.txt");
File file = new File(parameter.getFilterFilename());
String stopWord = Tools.text2String(file);
String stopWords[] = stopWord.split("\\s+");
for(int i=0;i<stopWords.length;i++){
for(int j=0;j<list.size();j++){
if(stopWords[i].equalsIgnoreCase(list.get(j))){
//System.out.println(list.get(j));
list.remove(j);
j--;
}
}
}
} ret = list.size(); return ret;
} /**
* @Auther: kevin
* @param textData
* @return: int
* @Descriptions:获取行数
* @date: 18-10-17 下午8:46
*/
public int getLineCount(String textData){ int ret = -1;
ret = textData.split(System.lineSeparator()).length;
return ret;
} /**
* @Auther: kevin
* @param textData
* @return: int
* @Descriptions:获取空行数
* @date: 18-10-17 下午8:46
*/
public int getEmptyLineCount(String textData){ int ret = 0;
String tmp[] = textData.split(System.lineSeparator());
for(int i=0;i<tmp.length;i++){
if(tmp[i].replaceAll("[\\s\\{\\}]","").equals(""))
ret++;
}
return ret;
} /**
* @Auther: kevin
* @param textData
* @return: int
* @Descriptions:获取代码行数
* @date: 18-10-17 下午8:46
*/ public int getCodeLineCount(String textData){
int ret = 0;
String tmp[] = textData.split(System.lineSeparator());
ret = getLineCount(textData)-getCommentLineCount(textData)-getEmptyLineCount(textData);
return ret; } /**
* @Auther: kevin
* @param textData
* @return: int
* @Descriptions:获取注释行数
* @date: 18-10-17 下午8:49
*/
public int getCommentLineCount(String textData){ int ret = 0;
String tmp[] = textData.split(System.lineSeparator());
for(int i=0;i<tmp.length;i++){
if(tmp[i].contains("//"))
ret++;
}
return ret;
}
}
Tools:
import java.io.*;
import java.util.ArrayList;
import java.util.List; public class Tools{
//-c 字符数
// -W 词数
// -l 行数
// -o 指定输出文件
// -e 停用词表,接文件名
// -a 返回更复杂的数据(代码行 / 空行 / 注释行)
// -s 递归处理目录下符合条件的文件,接文件名
// -x 调用高级功能
public static final String DEFAULTPARAS[] = {"-c","-w","-l","-o","-e","-a","-s","-x"};//8个 /*
*
* 将数组参数连接为字符串
* */
public static String junctParas(String args[]){
String junction = ""; for(int i=0;i<args.length;i++){
junction += args[i]+" ";
//System.out.println(args[i]);
} return junction.trim();
} /*
* 将参数放进parameter
*
* */
public static Parameter putParasToParameter(String longParas){
String opt = null;
String realParas[] = getRealParas(longParas);
Parameter parameter = new Parameter(); for(int i=0;i<realParas.length;i++){
opt = realParas[i];
switch (opt){
case "-c":
parameter.setShowCharCount(true);
break;
case "-w":
parameter.setShowWordCount(true);
break;
case "-l":
parameter.setShowlineCount(true);
break;
case "-o":
parameter.setOutput(true);
parameter.setOutPutFileName(getFileName("-o",longParas));
//System.out.println(parameter.getOutPutFileName());
break;
case "-e":
parameter.setFilterWord(true);
parameter.setFilterFilename(getFileName("-e",longParas));
break;
case "-a":
parameter.setShowMore(true);
break;
case "-s":
parameter.setProcessMultFiles(true);
parameter.setFilesName(getRealFileNameFromList(getFileName("-s",longParas)));
break;
case "-x":
parameter.setAdvance(true);
break;
default:
}
}
parameter.setInputfileName(getInputFileName(longParas)); return parameter;
}
/*
*
* 解析真实的命令参数
* */
private static String[] getRealParas(String longParas){
String tmp[] = longParas.split(" ");
List<String> realPara=new ArrayList<String>();
for(int i=0;i<tmp.length;i++){
for(int j=0;j<DEFAULTPARAS.length;j++){
if( tmp[i].trim().equals(DEFAULTPARAS[j]) ){
realPara.add(tmp[i]);
}
}
} return (String[])realPara.toArray(new String[realPara.size()]);
} //String canshu="-c e:\\test.txt -W -l -o -s -e file.txt";
/*
* 基础功能,单个输入文件名获取
*
* */
private static String getInputFileName(String longParas){
String inputFileName = null;
String tmp[] = longParas.split(" ");
for(int i=0;i<DEFAULTPARAS.length;i++){
for(int j=0;j<tmp.length;j++){
if(!DEFAULTPARAS[i].equals(tmp[j]) && tmp[j].length()>2 ){
//System.out.println(tmp[j]+" "+DEFAULTPARAS[i]);
if( !tmp[j].equals(getFileName("-o",longParas)) && !tmp[j].equals(getFileName("-e",longParas)) && !tmp[j].equals(getFileName("-s",longParas))){
//System.out.println(getFileName("-o",longParas)+getFileName("-e",longParas)+getFileName("-s",longParas));
inputFileName = tmp[j];
}
}
}
} return inputFileName;
} /*
*
* 通过命令参数获取 所需文件,如: 停用词表,输出文件
*
* */
private static String getFileName(String para,String paras){
boolean isNewFile = paras.contains(para);
String newFileName = null;
String str[] = paras.substring(paras.indexOf(para)+3).split(" ");
if(isNewFile){ newFileName = str[0];}
return newFileName;
} /*
* 筛选需要用到的文件,递归做匹配相应的文件.
*
* */
public static List<String> getRealFileNameFromList(String filePath){
String processedFile = getProcessedFileName(filePath);
String diviPath[] = getFileNameFormPath(filePath); List<String> fileList = getFileNameFromDir(new File(diviPath[0]));
for(int i=0;i<fileList.size();i++){
//System.out.println(fileList.size());
String fileName = getFileNameFormPath(fileList.get(i))[1];
//System.out.println(diviPath[0]+" "+processedFile);
if(!fileName.matches(processedFile) && !diviPath[0].equals(processedFile)){//当文件名匹配不成功成功时,移除不符合规则文件
fileList.remove(i);
i--;
}
} return fileList;
} /*
*
* 对文件名进行通配符解释
*
* */
private static String getProcessedFileName(String filePath){ String file[] = getFileNameFormPath(filePath);
file[1] = file[1].replace("*",".*");//匹配任意一个或多个字符
file[1] = file[1].replace("?",".{1,1}");//匹配任意一个字符
//file[1] = file[0]+file[1];
//System.out.println(file[0]+"6"+file[1]);
return file[1];
} /*
*
* 从路径中分离文件名和文件夹名,数组索引0为文件夹,数组索引1为文件
* */
private static String[] getFileNameFormPath(String filePath){
String ret[] = new String[2];
if(filePath.contains("/")){
int index = filePath.lastIndexOf("/");
int len = filePath.length(); ret[0] = filePath;
ret[1] = filePath; if(len != index+1){
String tmp = filePath.substring(index+1);
if(tmp.matches(".*\\.\\S*")) {
ret[0] = filePath.substring(0, index + 1);
ret[1] = filePath.substring(index + 1);
}
}
}else{
File directory = new File("");
ret[0] = directory.getAbsolutePath();
ret[1] = filePath;
}
return ret;
} /*
*
* 获取文件件下面所有文件
* */
private static List<String> getFileNameFromDir(File file){
List<String> fileList = new ArrayList<String>();
addFileNameToList(file,fileList);
return fileList;
} /*
*
* 通过递归把文件加入List
* */
private static void addFileNameToList(File file, List<String> fileList){ //System.out.println(file);
File files[] = file.listFiles(); if(files!=null) {
for (int i = 0; i < files.length; i++) {
//System.out.println(files.length);
if (files[i].isFile()) { fileList.add(files[i].toString()); } else if (files[i].isDirectory()) { File tmp = new File(files[i].toString());
addFileNameToList(tmp, fileList); }
}
}
} /*
*
* 从文件中读取数据转换为String类型数据
* */
public static String text2String(File file){
if(!file.exists())return null;
StringBuilder result = new StringBuilder(); try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次读一行 result.append(s+System.lineSeparator());
//System.out.println("+");
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return result.toString();
} /*
*
* 对所有结果进行统一设置
* */
public static void setResult(WordCount wordCount,Parameter parameter,Result result,String textData){ //System.out.println(wordCount);
//字符计数
if(parameter.isShowCharCount()){ result.setCharCount(wordCount.getCharCount(textData)); }
//词数计数
//System.out.println(result);
if(parameter.isShowWordCount()){ result.setWordCount(wordCount.getWordCount(parameter.isFilterWord(),textData)); } //总行计数
if(parameter.isShowlineCount()){ result.setLineCount(wordCount.getLineCount(textData)); } //代码行,注释行,空行计数
if(parameter.isShowMore()){
result.setCodeLineCount(wordCount.getCodeLineCount(textData));
result.setCommentLineCount(wordCount.getCommentLineCount(textData));
result.setEmptyLineCount(wordCount.getEmptyLineCount(textData));
}
//输出文件名
if(parameter.isOutput()) result.setOutPutFileName(parameter.getOutPutFileName());
else result.setOutPutFileName("result.txt");
} /*
*
* 格式化输出结果
* */
public static String formatInputData(String fileName,int charCount,int wordCount,int lineCount,int codeLineCount,int commentLineCount,int emptyLineCount){
String ret = "文件名路径: "+fileName+" 字符数: "+ String.valueOf(charCount)+" 词数: "+String.valueOf(wordCount)+" 总行数: "+String.valueOf(lineCount)+" 代码行数: "+String.valueOf(codeLineCount)+" 注释行数: "+String.valueOf(commentLineCount)+" 空行数:"+String.valueOf(emptyLineCount);
return ret;
} /*
*
* 将数据写入文件
* */
public static void writeFile(String fileName,String data){
File file = new File(fileName);// 要写入的文件路径
if (!file.exists()) {// 判断文件是否存在
try {
file.createNewFile();// 如果文件不存在创建文件
System.out.println("文件"+file.getName()+"不存在已为您创建!");
} catch (IOException e) {
System.out.println("创建文件异常!");
e.printStackTrace();
}
} else {
System.out.println("文件"+file.getName()+"已存在!");
} FileOutputStream fos = null;
PrintStream ps = null;
try {
fos = new FileOutputStream(file,true);// 文件输出流 追加
ps = new PrintStream(fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String string = data+"\r\n";// +换行
ps.print(string); // 执行写操作
ps.close(); // 关闭流 System.out.println("文件写入完毕!");
}
}
另外单元测试,也做了相应的函数测试:
界面:
Tools(太多就贴两张图):
WordCount(太多就贴两张图):
五.总结:
这次结对编程给我很大的影响。首先通过这次作业学到的不仅仅是编程的部分,合作也是之间相互协调很重要。
这个成立: 1+1>2
另外在讨论中我们都能相互学习到对方不了解的领域。另外编程部分了解一些工具的使用,学会一点皮毛的单元测
试,一些编码规范也同时了解到一些。
这次编码不是时间用的最多的,反而是两个人之间代码相互融合,以及对函数的缺陷的修改。当然此次项目的
结果还是有很多bug的,所以再之后我们还会抽时间继续完善一些函数,另外做到优化性能。这次合作项目只是
简单的开始,”路漫漫其修远兮,吾将上下而求索“。此后的时间里我会更加注重基础,因在这个项目中给我影响最
大是java自带的函数之强大,让我感受到了算法之美!!!ps:贴上自己的WordCount
WordCount合作--自己部分的更多相关文章
- 第三次作业-结对编程(wordcount)
GIT地址 https://github.com/gentlemanzq/WordCount.git GIT用户名 gentlemanzq 结对伙伴博客地址 https://home.cnblogs ...
- WordCount扩展与优化
合作者:201631062327,201631062128码云地址:https://gitee.com/LIUJIA6/WordCount3 一:项目说明 本次项目是在上次作业WorldCount的基 ...
- 软工实践第五次作业-WordCount进阶需求
软工实践作业(五) GitHub 作业链接 结对博客 031602240 具体分工 PSP表格 代码规范 解题思路与设计说明 爬虫使用 代码组织与内部实现设计(类图) 算法关键 实现方法 流程图 附加 ...
- WordCount 的实现与测试
一.开头 (1)合作者:201631062627,201631062427 (2)代码地址:https://gitee.com/catchcatcat/WordCount.git 二.正文 (1)基本 ...
- 结对第2次作业——WordCount进阶需求
作业题目链接 队友链接 Fork的同名仓库的Github项目地址 具体分工 玮哥负责命令参数判断.单词权重统计,我只负责词组词频统计(emmmm). PSP表格 预估耗时(分钟) 实际耗时(分钟) P ...
- WordCount 2.0(结对项目)
序言 合作伙伴 201631062220 201631062120 项目码云地址: https://gitee.com/zhege/WordCount 作业详细要求 系统分析与设计结对项目 ...
- hadoop 2.7.3本地环境运行官方wordcount
hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...
- Hadoop3 在eclipse中访问hadoop并运行WordCount实例
前言: 毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...
- Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码
万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...
随机推荐
- php的优缺点(转)
1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(Fr ...
- 树状数组求LIS
我真的是咸鱼啊 多少年前的基础了我竟然才弄明白,哭 用树状数组维护<=x的最上上升子序列的最大值即可啊Orz 我真的菜的一笔啊! #include <bits/stdc++.h> u ...
- maven 依赖的传递性
1.如图我们有三个项目,项目Age,项目Bge,项目Cge 2.我们使Age项目依赖到Bge项目,Bge项目依赖到Cge项目 Age项目和Bge项目分别执行命令:mvn install 打包*.ja ...
- 为DK2应用程序迁移到Oculus CV1做好准备!
为DK2应用程序迁移到Oculus CV1做好准备! 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/arti ...
- 纯js编写验证信息提示正则匹配数字,字母,空值
1.显示效果 2,html结构 <div class="border_bg"> <div id="upcCode" style="p ...
- spring boot不同环境读取不同配置
具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...
- Python Study (05)装饰器
装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...
- [Node.js] Proxy Requests for Local and Remote Service Parity
High availability apps require that no distinction be made between local and remote services. Attach ...
- hdu 4888 2014多校第三场1002 Redraw Beautiful Drawings 网络流
思路:一開始以为是高斯消元什么的.想让队友搞,结果队友说不好搞,可能是网络流.我恍然,思路立刻就有了. 我们建一个二部图.左边是行,右边是列,建个源点与行建边,容量是该行的和.列与新建的汇点建边.容量 ...
- 并发编程网 - ifeve.com
并发编程网 - ifeve.com 让天下没有难学的技术 首页 JAVA 深入浅出ClassLoader 深入浅出ClassLoader Dedicate to Molly. 你真的了解ClassLo ...