201621123053 张雨阳软工作业3

本文详细记录了一次结对编程项目的经历,包括项目地址、PSP表格、解题思路、设计实现、代码说明及图形界面展示。通过分析,展示了如何有效分配时间和资源,以及在开发过程中遇到的挑战和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.码云项目地址

https://gitee.com/milan_kaka/PairProject-Java

搭档项目和码云地址:

学号 201621123086:

https://www.cnblogs.com/piraat/p/9754497.html

https://gitee.com/piraat/PairProject-C/tree/master

2.PSP表格

PSP结对开发流程预估耗费时间(分钟)实际耗费时间(分钟)
Planning计划60900
· Estimate明确需求和其他相关因素,估计每个阶段的时间成本2040
Development开发300380
· Analysis需求分析 (包括学习新技术)6060
· Design Spec生成设计文档3030
· Design Review设计复审3030
· Coding Standard代码规范1515
· Design具体设计120100
· Coding具体编码180100
· Code Review代码复审3030
· Test测试(自我测试,修改代码,提交修改)100160
Reporting报告6060
·测试报告30120
·计算工作量1010
·并提出过程改进计划2020

3.解题思路描述

需求提升,需要新增三个功能。

  1. -m 查找词频为m的词组。
  2. -n 查找出现最n大的词语。
  3. -o 将输出结果写入文件output.txt。
  4. -i 打开文件。

除第一个功能外,其他三个功能可以在原有基础上改动。比如-n功能可以在输出时增加一个循环,循环输出排序好的HashMap。

4.设计实现过程

  1. -m 功能在WordCounter中新建了类 public Map getM(int m);。
  2. -n 功能的实现是在输出时将排序好的HashMap循环n次输出。
  3. -o 功能是原有功能。
  4. -i 只要将命令后的文件名提取就可以,其余和之前功能一样。

5.代码说明

(1)、新增功能类 public Map getM(int m);

public Map getM(int m){
        wordFreq1 = new HashMap<String, Integer>();// 词频为m的词组
        String t = text;
        String[] str = t.split("\\s");
        for (int i = 0; i < str.length-m+1; i++) {
            String word = "";
            int temp = 1;
            for(int j = i; j< i+m ; j++ ){
            
                if (str[j].length() < 4) { // 判断长度是否大于等于4   
                    temp = 0;
                    break;
                } else {
                    
                    int flag = 1; // 判断字符串的前四位是否是英文字母
                    char a;
                    
                    for (int k = 0; k < 4; k++) {
                        a = str[j].charAt(k);
                        if (!(a >= 'A' && a <= 'Z' || a >= 'a' && a <= 'z')) {
                            flag = 0;
                        }
                    }
                    if(flag==0){
                        temp = 0;
                        break;
                        }
                    else{
                        word = word + str[j] + " ";
                    }
                }
            }
            if (temp == 1 && word.trim().length() != 0) {
                if (wordFreq1.get(word.trim()) == null) { // 判断之前Map中是否出现过该字符串
                    wordFreq1.put(word.trim(), 1);
                } else
                    wordFreq1.put(word.trim(), wordFreq1.get(word.trim()) + 1);
                }
    
        }
        return wordFreq1;
    
    }

原来是直接判断是否为单词,如果是单词就输入进Map中。现在多增加一个循环,如果单词就将其添加到word中,m次后将word输入进Map中。然后置word=""。一共要循环单词总数-m+1词,这时所有词频为m单词就全部输入进Map里面了。可以利用之前构造的函数对其排序。

(2)、主函数

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] command=str.split("\\s+");
    
        FileDeal fd = new FileDeal();
        String[] wFreq;
        String[] wFreqM;
        List sortMap;
        List sortMapM;
        
        String file=null;
        int m=0;
        int n=0;
        String out=null;
        int len=command.length;
        for(int i=0;i<len;i++){
            if(command[i].equals("-i")){
                file=command[i+1];
            }
            if(command[i].equals("-m")){
                m=Integer.parseInt(command[i+1]);
            }
            if(command[i].equals("-n")){
                n=Integer.parseInt(command[i+1]);
            }
            
            if(command[i].equals("-o")){
                out=command[i+1];
            }
        }
        String text = fd.FileToString(file);
        WordCounter wd = new WordCounter(text);
        // 调用类中的方法获取相应的数值
        int charNum = wd.getCharCount();
        int wordCount = wd.getWordCount();
        int ValidLine = wd.getLineCount();
        Map<String, Integer> wordFreq = wd.getWordFreq();
        sortMap = wd.sortMap(wordFreq);
        wFreq = wd.ListToArray(sortMap);
        String w = charNum + "\r\n" + wordCount + "\r\n" + ValidLine + "\r\n";
        for (int i = 0; i < wFreq.length; i++) {
            w = w + wFreq[i] + "\r\n";
        }
        if(m!=0){
            Map<String, Integer> wordFreqM = wd.getM(m);
            sortMapM = wd.sortMap(wordFreqM);
            wFreqM = wd.ListToArray(sortMapM);
            for(int i=0;i<wFreqM.length;i++){
                System.out.println(wFreqM[i]);
            }
        }
        if(n!=0){
            for(int i=0; i<n; i++){
                System.out.println(wFreq[i]);
            }
        }
        if(out!=null){
            fd.WriteToFile(w);
        }
        
    }

}

主函数需要将功能模块(-i,-m之类的)和语句(如输入的m,文件名input.txt)等分割开。这里我用字符串数组取出来,进行判断。但是这样有个缺点就是一旦命令行输入错误会直接导致程序崩溃。

之后就是调用各个部分的功能函数进行运算了。

截图

-m

1123151-20181008181413490-1986780965.png

1123151-20181008181420552-1670808662.png

-n -o

1123151-20181008181447939-756219907.png

1123151-20181008181459567-1369747326.png

1123151-20181008181525296-1495995296.png

(3)、图形界面:

package WordCount;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;
import javax.swing.JTextArea;

public class JF extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    public String str;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JF frame = new JF();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public JF() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        textField = new JTextField();
        textField.setBounds(65, 54, 141, 41);
        contentPane.add(textField);
        textField.setColumns(10);
        JTextArea textArea = new JTextArea();
        textArea.setColumns(5);
        textArea.setBounds(65, 110, 268, 119);
        contentPane.add(textArea);
        
        JButton btnNewButton = new JButton("上传");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                String str = textField.getText();
                String[] command=str.split("\\s+");
                
                FileDeal fd = new FileDeal();
                String[] wFreq;
                String[] wFreqM;
                List sortMap;
                List sortMapM;
                
                String file=null;
                int m=0;
                int n=0;
                String out=null;
                int len=command.length;
                for(int i=0;i<len;i++){
                    if(command[i].equals("-i")){
                        file=command[i+1];
                    }
                    if(command[i].equals("-m")){
                        m=Integer.parseInt(command[i+1]);
                    }
                    if(command[i].equals("-n")){
                        n=Integer.parseInt(command[i+1]);
                    }
                    
                    if(command[i].equals("-o")){
                        out=command[i+1];
                    }
                }
                String text = null;
                try {
                    text = fd.FileToString(file);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                WordCounter wd = new WordCounter(text);
                // 调用类中的方法获取相应的数值
                int charNum = wd.getCharCount();
                int wordCount = wd.getWordCount();
                int ValidLine = wd.getLineCount();
                Map<String, Integer> wordFreq = wd.getWordFreq();
                sortMap = wd.sortMap(wordFreq);
                wFreq = wd.ListToArray(sortMap);
                String w = charNum + "\r\n" + wordCount + "\r\n" + ValidLine + "\r\n";
                for (int i = 0; i < wFreq.length; i++) {
                    w = w + wFreq[i] + "\r\n";
                }
            
                if(m!=0){
                    Map<String, Integer> wordFreqM = wd.getM(m);
                    sortMapM = wd.sortMap(wordFreqM);
                    wFreqM = wd.ListToArray(sortMapM);
                    String w1 = "";
                    for(int i=0;i<wFreqM.length;i++){
                        w1 = w1 + wFreqM[i] + "\r\n";
                    }
                    textArea.setText(w1);
                }
                if(n!=0){
                    String w1 = "";
                    for(int i=0; i<n; i++){
                        w1 = w1 + wFreq[i] + "\r\n";
                    }
                    textArea.setText(w1);
                }
                if(out!=null){
                    try {
                        fd.WriteToFile(w);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        });
        btnNewButton.setBounds(223, 54, 108, 41);
        contentPane.add(btnNewButton);
        
        
        
        
    }
}

图形界面做的比较简单,就是从文本框输入进命令,然后点击提交,在下面的输出结果栏显示输出结果。

1123151-20181008181349594-1230481076.png

1123151-20181008181356243-127265684.png

6.单元测试

1123151-20181008181539252-1803251174.png

7.效能分析

1123151-20181008181556909-557356678.png

8. 实验小结

  1. 这次时间跨度有点长,因为和搭档不是特别的熟悉,本来准备自己写一点,国庆的时候在一起讨论。但是我母亲做了一趟手术,国庆回了一次家。所以两个人基本是在网上完成讨论的,所以代码有很多不一样的地方。效果就我个人而言不是特别的理想。这是我个人的原因。
  2. 关于这次实验,之前没有想到String 能直接用+来运算,一直想用StringBuilder来做,但是这方面没学好,一直出错。问了同学才发现可以直接+,简便很多。
  3. 单元测试和效能分析还是有错,感觉是单元测试代码的问题,和我本身的代码没有关系。效能测试则是一打开程序就自动退出。这个就可能是程序本身的代码出错了。准备之后找同学要一下他们的代码学习一下。
  4. 关于图形界面,其实本来想做一个更像程序的界面,就是直接点击按钮就可以执行功能而不是还需要自己去输入命令。但是国庆从家里赶回来时间比较紧,只做了一个简单的GUI。

转载于:https://www.cnblogs.com/ACmilan1899kaka/p/9756046.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值