OOP第一次博客作业

本文讲述了作者在Java编程初学者阶段,通过解决涉及正则表达式、Calendar类、LinkedList以及复杂类间关系的三次作业,逐步掌握知识点并反思了设计结构的重要性。作者强调了正确设计类与类之间的关系、遵循迪米特法则和单一职责原则对代码质量的影响。
摘要由CSDN通过智能技术生成

  一:前言

        本次题目集1~3共12题,涉及到了正则表达式,Calendar类的使用,Linkedlist类的使用等,对于我这个刚接触java没多久的小白来说,1~3的最后一题难度颇高。

二:设计与分析

        第一次作业:

解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案)和答案,并且问题与答案是一对一的关系。

心得:第一次作业比较简单,一开始做的时候没注意到要题目给的设计建议,所以没去设计相应的类,但是还是很好做的,但是这对之后的作业有不好的影响。从这题开始,我开始学会了正则的应用,也体验到了正则表达式对于字符串的处理的强大。

        第二次作业:

解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案),试卷(包括试卷号,题号,分值)和答卷(包括答案内容,试卷号)。题目与试卷是多对多的关系(一个题目可以在多张试卷中,一张试卷可以包含多个题目),题目与答卷是多对多的关系(一个题目可以出现在多张答卷中,一张答卷可以有多个题目的答案),试卷与答卷是一对多的关系(一张试卷可以对应多张答卷,一张答卷只能对应一张试卷)。

心得:这里要处理好这三个类之间的关系,不然代码写到后面会很乱,并且会让第三次作业写的非常艰难(我已经中枪...),这里对于题目的提取最好用到HashMap,可以让后续的比较,问题与答案的匹配,问题内容的打印更方便。

        第三次作业:

解释:从题目给的字符串中提取出题目(包括题号,题目内容,标准答案),试卷(包括试卷号,题号,分值),答卷(包括答案内容,试卷号,学号,题目序号),学生(包括姓名,学号)和删除的题目。题目与试卷是多对多的关系(一个题目可以在多张试卷中,一张试卷可以包含多个题目),题目与答卷是多对多的关系(一个题目可以出现在多张答卷中,一张答卷可以有多个题目的答案),试卷与答卷是一对多的关系(一张试卷可以对应多张答卷,一张答卷只能对应一张试卷),学生与答卷是一对一的关系(一张答卷对应一个学生,一个学生对应一张答卷)。

心得:在写代码前,提前构思好类与类之间的关系十分重要,因为第二次作业,我的类与类之间的关系没有设计好,改一处代码,其他代码的效果也会跟着改,导致我第三次作业写的举步维艰。

三:踩坑心得

        第一次作业:

1.字符串的比较用了“==”,源码如下:

for (int i = 0; i < num; i++) {
    for (int k = 0; k < num; k++) {
        String number = String.valueOf(i+1);
        if(str1[k][0].trim()==number){
            System.out.println(str1[k][1].trim()+"~"+str2[i]);
        }
    }
}
for (int i = 0; i < num; i++) {
    for (int k = 0; k < num; k++) {
        String number = String.valueOf(i+1);
        if(str1[k][0].trim()==number){
            if(str1[k][2].trim()==str2[i].trim()){
                System.out.print("true");
            }
            else{
                System.out.print("false");
            }
            if(i<num-1){
                System.out.print(" ");
            }
        }
    }
}

导致了程序运行没有结果

2.在比较字符串是没有将空格删去,导致了一些测试点出差,源码如下:

for (int i = 0; i < num; i++) {
    for (int k = 0; k < num; k++) {
        String number = String.valueOf(i+1);
        if(str1[k][0].equals(number)){
            System.out.println(str1[k][1].trim()+"~"+str2[i]);
        }
    }
}
for (int i = 0; i < num; i++) {
    for (int k = 0; k < num; k++) {
        String number = String.valueOf(i+1);
        if(str1[k][0].equals(number)){
            if(str1[k][2].equals(str2[i])){
                System.out.print("true");
            }
            else{
                System.out.print("false");
            }
            if(i<num-1){
                System.out.print(" ");
            }
        }
    }

在字符串比较时加上trim方法去掉两端的空格后程序正常

        第二次作业:

类与类的关系设置的不当,导致类与类之间的关系混乱,逻辑混乱,循环,选择结构嵌套的太深,导致代码写着写着自己都不认识了,例如下面一段源码:

for (int i = 1; i <= countT; i++) {

            for (int j = 0; j < countT; j++) {
                if (Integer.parseInt(papers[j].score[0])==i){
                    for (int k = 0; k < countS; k++) {
                        if(Integer.parseInt(answersheets[k].answer[0])==i){
                            missing = 1;
                            int m = 1;
                            int n = 1;

                            while(papers[j].score[m]!=null){
                                if(m%2==1){
                                    for (int l = 0; l < countN; l++) {
                                        if (Integer.parseInt(papers[j].score[m])==papers[j].titles[l].tnumber){
                                            if(answersheets[k].answer[n]!=null) {
                                                System.out.print(papers[j].titles[l].question + "~" + answersheets[k].answer[n]);
                                                if(answersheets[k].answer[n].equals(papers[j].titles[l].standardAnswer))
                                                {
                                                    System.out.println("~true");
                                                    count[c] = Integer.parseInt(papers[j].score[m+1]);
                                                }
                                                else{
                                                    System.out.println("~false");
                                                    count[c] = 0;
                                                }
                                                c++;
                                                n++;
                                            }
                                            else{
                                                System.out.println("answer is null");
                                                c++;
                                            }
                                        }
                                    }
                                }
                                m++;
                            }
                        }
                        int sum = 0;
                        int flag = 0;
                        for (int x = 0; x < c; x++) {
                            sum = sum+count[x];
                            System.out.print(count[x]);
                            if(x!=c-1){
                                System.out.print(" ");
                            }
                            flag=1;
                        }
                        if (flag==1) {
                            System.out.println("~" + sum);
                        }
                        for (int x = 0; x < c; x++) {
                            count[x] = 0;
                        }
                        c=0;
                    }
                }
            }
            if(missing == 0){
                System.out.println("The test paper number does not exist");
            }
        }

        第三次作业:

继第二次作业的问题,在设计类和题目的主体结构时,没有遵循迪米特法则和单一职责,导致第三次作业在第二次作业的基础上增加内容时,修改一处的代码,其他处的代码的执行效果也会跟着修改,导致整个程序越改越乱,最后只能从头设计题目的主体结构。

四.改进建议:

利用HashMap来存储题目对象,试卷对象,答卷对象,学生对象,在利用ArrayList存储HashMap。

五.总结:

因为在写这三次作业之前,我没有花时间去构思其主体结构,导致代码逻辑十分混乱,代码质量很差,所以,在下次作业当中,我一定会花时间去构思好主体结构,设计好类与类之间的关系,尽量去遵守迪米特法则和单一职责。虽然本次作业做的不好,但是我仍然学到了正则表达式,HashMap等好用的知识点,但是对于如何设计类的能力我还要好好去努力。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值