OOP作业总结(二)

longjing0307 / 2023-05-03 / 原文

一、前言

题目集四

*知识点:类的结构与实体类的设计,根据要求设置完善其他类的结构与内容。对象数组的使用及对象数组中数据的获取、存入、遍历与输出。用String类中split(" ")对字符串的的分隔及对字符串的数据类型转换。哈希集HashSet,该容器中只能存储不重复的对象。LinkedHashSet集合添加和取出元素的顺序一致且不允许添加重复的元素。对类的封装性的理解与运用,私有成员变量要用getter、setter来获取与设置。Integer类中parseInt()方法的用法。LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用。ChronoUnit类中DAYS、WEEKS、MONTHS等单位的使用。

*题量:7-1~7-7共7题题量适中。

*难度:7-1难度比较大,7-2、7-3用循环由于内存太大、运行超时,重新写了好几个代码都不能顺利过测试。7-7以类似的方法判断时间先后并输出间隔的天数、周数,但只拿了10分。其他的题目相对而言较为简单。完成情况如下:

题目集五

*知识点:正则表达式的String.matches(" ")方法及根据指定要求编写正则表达式。Arrays类中的sort方法排序,将字符串转化为字符数组的toCharArray()方法。类之间的关系:主要是类间的聚合关系与依赖关系的学习、聚合关系与组合关系的使用区别、类间不同的聚合结构。

*题量:7-1~7-6共6题 题量适中

*难度:此次题目集难度较小,大部分题目是正则表达式的训练。最后两道题为日期问题的两种聚合方式,主要是类的结构的设计,主类与什么类存在依赖关系的区分,难度也比较小。7-6有两个测试点没过只拿了40分。完成情况如下:

 

题目集六

*知识点:类的合理设计、对象数组的使用、Calendar类中get(Calendar.DAY_OF_WEEK)的用法、自定义数据类型作为方法的返回值和方法参数。

*题量:共一题,题量少。

*难度:个人认为此次题目集虽题量少,但难度相对较大。难点在于对类结构的设计,应有哪些类比较清晰,但是异常情况比较多,不清楚应该在实体类中进行判断还是在主类中进行判断。以及自己对异常情况有的不太明确顺序,总体就是异常情况的判断及输出顺序比较混乱,无法理清,感觉一团糟。其他类的结构及内容已基本完善好,主要原因是主类中对异常判断的输出顺序以及理不清。导致此次题目集没能顺利完成。

二、设计分析

题目集四7-1

类图:

 圈复杂度:

解题心得:本题整体来说难度中上,1、主要问题是看到这个题目大量的文字信息阅读好几遍后对类的创建有个大概的想法,但是在实际写代码的过程中发现还是存在困难:一个方面是对对象数组的运用不熟练,考虑是否使用集合来存储对象数据,但此题菜品对象并不多,使用对象数组存储符合已给代码的引领而且由于菜品对象与订单对象并不是很多,使用对象数组遍历也很方便。2、在对对象数组进一步复习后开始尝试写此代码,在编写订单及菜品的添加方法时由于最初的思路与所给的部分代码不一致,对这些方法的返回值类型的设置不能很好地理解,以至于在此浪费了许多时间。3、在主类中决定采用String类中的split方法将输入的一行数据分隔开并将值赋入对象数组中。

 题目集五7-5

 类图:

圈复杂度:

 题目集五7-6

 类图:

圈复杂度:

解题心得:这两道题难度不大,主要内容是类之间的聚合与依赖关系。算法是之间就练过的,这两题主要是对类的结构与关系的考验。重点就是理解类与类之间关系的使用场合,选择合适的关系,再一个就是类中的方法比较多,应当注意方法与方法之间调用的逻辑。还有一个容易出错的点就是语句执行的顺序,在多层嵌套循环中容易迷糊,应注意语句执行的地方。

三、踩坑心得

题目集四7-2、7-3

1、关于有时间与内存限制的情况,当范围比较大时,用普通的双循环难以通过测试点,即使写了三个不同的代码也是运行超时。这时可以考虑使用哈希集,可以把数据的存储和查找消耗的时间大大降低。而如果要使数据的输出与输入时的顺序一致则要使用LinkedHashSet。修改后代码如下:

7-2:

java.util.Arrays;
import java.util.Scanner;
import java.util.HashSet;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num=sc.nextInt();
        int[] array1 = new int[num];
        //array1[0] = sc.nextInt();
        HashSet<Integer> set = new HashSet<>();
        for (int i=0; i<num; i++) {
            array1[i] = sc.nextInt();
            //int j=Arrays.binarySearch(array1, 0, i, array1[i]);
            //if (j>=0 && j<=i-1) {
                //System.out.print("YES");
                //return ;
                set.add(array1[i]);
        }
        boolean check=set.size()==num?true:false;
        if(check==true){
            System.out.println("NO");
        }else{
        System.out.print("YES");
       }
    }
}:

7-3:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] array1=new int[num];//用来存输入的数字个数
        LinkedHashSet<Integer> set = new LinkedHashSet<>();
        for (int i = 0; i < num; i++) {
            int num1 = sc.nextInt();
            array1[i]=num1;
            set.add(array1[i]);}
        ArrayList<Integer> nums =new ArrayList<>(set);//LinkedHashSet里面没有get方法不好获取 
        for(int i=0;i<nums.size();i++){
            if(i==nums.size()-1){//最后一个不用输出空格
                System.out.print(nums.get(i));
            }else{
                System.out.print(nums.get(i)+" ");
            }
        }
      }
    }

 题目集四7-1、题目集六7-1

2、对于练习过的知识点要经常使用或者偶尔复习,例如对象数组,在之前写代码就有接触并使用过对象数组,而在这次练习中又忘记了对象数组的一些知识。这就使得在每次使用时还得查找资料再复习,使得写代码时经常停下思路去查知识点,降低了写代码的效率,也是知识点不牢固不熟练的体现。

3、对方法返回类型应当联系方法在整个类或其他类中的作用来确定,合理地思考,而不是随意改给定的代码。如:

public Dish searchDish(String dishName){//根据菜名在菜谱中查找菜品信息
        Dish d=null;
        for(int i=c-1;i>=0;i++){
            if(dishName==dishs[i].name ){
                d=dishs[i];
                break;
            }
        }
        if(d==null){
            System.out.println(dishName +"does not exist");
        }
        return d;
    }

4、在编写添加一个菜品方法时初步考虑直接用对象数组将菜品信息添加到本类的成员变量中,写了许多又想起数组在运行中不能改变其数组大小,即使是再编写一个方法把原有数据传进新的数组,新的数组大小比原数组大1,最后使该方法返回是数组类型也还是无法实现,因为还是要使该数组的大小等于该类的成员变量对象数组的大小,依然会在运行中改变成员变量中对象数组的大小。最后分析决定给对象数组在初始化时就给定一个比较大的数,例如100、1000等等。

 四、改进建议

 1、题目集四7-4单词统计与排序感觉可以直接用String.length获取字符的长度进行一个排序,再将字符进行大小的排序。在算法上感觉会更清晰与简单。而不是用TreeSet跟Iterator。

2、对于题目集四7-1及题目集六7-1,可以考虑用集合存放各类数据,这样在存放、获取菜品、订单时感觉会更方便快捷。

3、个人方面感觉知识点不够扎实、缺乏训练,使得在写代码时抽出时间去确认某个知识点的用法,比较浪费时间。个人方面需要改进的就是在日常多训练运用所学,深刻记忆,而不是似懂非懂,模模糊糊。

 五、总结

1、知识点上:

(1)、菜单计价程序中学习到原来同一个类中有关系的成员变量与成员方法可以在本类中不产生关系,而是在主类中通过调用产生关系,这会使得类的设计结构更为清晰明了。

(2)、对对象数组这部分知识有了更好的训练与巩固。

(3)、学习到可以把数据的存储和查找消耗的时间大大降低的HashSet集以及可以使数据的输出与输入时的顺序一致的LinkedHashSet集。也稍微涉猎了TreeSet。

(4)、学习到类与类之间的之间的关系,以及聚合与组合之间的区别。

(5)、对正则表达式有了初步的认识,在训练之后基本能自己编写指定校验格式的正则表达式。

 2、学习方法上:

(1)、菜单问题很明显地感觉到自己与他人的差距,感觉自己在编程方面能力方面远不及他人,但是又有在努力学,比较无力。

(2)、对使用过的知识点应该在学会回顾,而非学了新的旧的便模模糊糊。

(3)、还是要加强对自己的训练,努力追赶上他人。

3、进一步改进:

(1)、多花时间回顾一些知识点以及提前学习老师下节课要讲的内容,便不会在课堂上听得一头雾水。

(2)、对自己的源代码在通过测试点后可以尝试有没有其他思路可以优化自己的代码,这可以锻炼自己的思维。

(3)、可以在课后自己学习下一些较为规范、标准的代码,提高自己代码的质量。

4、对课程、作业、实验的建议:

(1)、感觉每个人都有自己的事、请教有时候也没有答案,希望老师可以在比较难的题目上大概讲解一下,不然就是一直想不通也没有人教。

(2)、希望可以有其他训练平台自己自愿进行训练,而不是只能靠pta计分制的训练,有些题是每天都在想某个点怎么处理却还是写不出来。