题目集5~7

通过完成pta的题目集5-7,我对java学习也有了初步的了解,三个题集围绕电梯运行系统,层层迭代,逐步增加类的种类与题目难度。

一·前言

1,知识点总结
(1)掌握了一些基本的java语法知识,能够正确处理并且区分各类型的名称和类和方法。在写代码的过程中,掌握了如何正确运用if-else语句来进行精准的条件判断,还学会了使用while循环高效地处理请求。这种能力的提升,在面对复杂逻辑时,能够清晰地根据不同条件执行相应的操作,并可以持续迭代处理任务,直到满足特定的终止条件,高效达到目的。
(2)使用了LinkedList对电梯的内部请求和外部请求进行存储,灵活地为每个元素分配必要的内存空间,从而可以按照题目要求依次处理信息,分析电梯要求。使用的过程中我也了解到LinkedList可以根据需要动态调整大小,无需预先指定容量。这对于请求数量不确定的情况非常有用,适应了所编写题目的要求,可以不断地向列表中添加乘客请求,而不用担心空间不足的问题。除此之外,学习了LinkedList的插入和删除元素,让它发挥了较高的效率。
(3)掌握了字符串处理,基本的就是使用Scanner类中nextLine方法读取整行字符串。使用startsWith和endsWith方法判断输入字符串的格式是否符合要求。例如,判断输入的字符串是否以<开头,并以>结尾,以此来判断输入是否为有效的电梯请求格式。使用trim方法去除输入字符串两端的空白字符(如空格、制表符、换行符等),确保输入内容的准确性,避免因空白字符导致的解析错误。使用split方法将字符串按指定的分隔符分割成字符串数组。在处理电梯的外部请求时,使用逗号作为分隔符将楼层和方向信息分开。
(4)掌握了对类的职责的初步设计。题集五定义了ExternalRequest、Elevator和Main三个类。题集六定义了ExternalRequest(外部请求)、InternalRequest(内部请求),Elevator(电梯)和Controller(电梯控制器)和Main五个类。题集七定义了Passenger(乘客请求)、RequestQueue(请求队列管理)、Elevator(电梯)和Controller(电梯控制器)和Main五个类。在完成题目的过程中,通过不同的类的构造完成面向对象的设计,逐渐掌握了分析各个类所应该具备的属性与方法的能力,加深了对面向对象的认识与理解,改变了原来面向过程的思维模式,遵守单一职责,让代码更加规范有序,针对性更强。Elevator类代表电梯,一开始包含电梯的各种属性(如当前楼层、方向、状态等)和方法(如添加请求、处理请求等),但在加入了Controller和RequestQueue之后,处理请求的方法所处的类得到改变。分工管理更加明确。
(5)学会了不同方法的不同运用。构造方法,在创建对象时对对象的属性进行初始化。例如使用new关键字创建Elevator对象时,构造方法就会被调用,从而对电梯对象的当前楼层、方向、状态以及最小和最大楼层这些属性进行初始化。理解private修饰符和public修饰符的区别,private对类的属性进行封装,通过公共方法来访问和修改这些属性,以此保证数据的安全性,同时搭配get和set方法来实现对变量的间接访问和修改,pulic让类、方法或变量在其他类中被广泛使用时。

2,题量与难度
题量比较合适,但每个题集后面编程题难度较大,对于刚入门的我来说完成会比较吃力。但也可能是由于我个人对题目的理解不到位,有些逻辑比较混乱,自己分析着分析着却出现更多的问题。面对题目的逻辑有一点想法,但是不知道如何将它转化为编程语言。或者是转化过程中又出现其他问题,对各种情况分析的逻辑有点混乱,总是容易忽略某些情况。三次题目难度迭代,但是最主要的方法逻辑未能掌握,凭自己的能力找不到自己问题所在,前面存在的问题在后面反复修改之后依然得不到解决,甚至越改越错。

二·设计与分析

1,题集五




(1)运用枚举
Direction:定义电梯的移动方向(UP、DOWN、NONE ),简洁清晰地表示电梯运行方向相关概念,增强代码可读性和可维护性。
State:定义电梯的状态(STOPPED、MOVING、OPENING、CLOSING ),用于描述电梯在不同阶段的状态,使电梯状态管理更直观。
(2)Elevator 类作为核心类,封装了电梯的各种属性(如当前楼层、最小最大楼层、运行方向、状态 )和行为(处理请求、移动、判断是否停止等 )。
维护内部请求队列(innerQueue )和外部请求队列(outerQueue ),通过不同方法实现对请求的添加、处理逻辑,将电梯运行的业务逻辑集中在该类中实现
(3)复杂度分析
Lines(行数):366 行。
Statements(语句数):156 条。
Percent Branch Statements(分支语句占比):17.3% 。
Method Call Statements(方法调用语句数):74 。
Percent Lines with Comments(注释行占比):18.9% 可以增加注释,有助于提高代码可读性和可维护性。
Classes and Interfaces(类和接口数量):4 。
复杂度相关
Average Statements per Method(平均方法语句数):5.70 代码不够精简。
Main.main() ,程序入口方法通常承担较多初始化和流程控制工作,易成为复杂度较高的方法。
Maximum Complexity(最大复杂度):7 ,复杂方法可以优化。
Average Complexity(平均复杂度):1.83 。
深度相关
Maximum Block Depth(最大代码块深度):5 。
Average Block Depth(平均代码块深度):1.45 。

2.题集六





(1)在determineDirection 方法依据电梯内外部请求队列状况确定运行方向。
先检请求队列,无请求则设电梯方向为 NONE 并返回。
获取内、外部请求队列首个请求,确定对应方向 intFang、extFang 。
分情况讨论:
内、外部请求都有时,依当前方向与内、外请求方向的关系及目标楼层距离等确定电梯方向。
仅内部有请求,用内部请求方向。
仅外部有请求,用外部请求方向。
但是在运行过程中这个逻辑好像也是存在一些问题,但是又没找到逻辑上的具体错误在哪
(2)将原来Elevator类中的部分方法移出来了,单独放在Controller类里面,更能体现面对对象的单一职责
(3)复杂度分析
Lines:351 行,反映代码规模。
Statements:183 条,衡量代码中可执行语句数量。
Percent Branch Statements:17.5%。
Method Call Statements:65 。
Percent Lines with Comments:7.7% 。
Classes and Interfaces:3 。
复杂度相关
Average Statements per Method(平均方法语句数):5.65 ,反映方法平均代码量。
Line Number of Most Complex Method(最复杂方法所在行号):297 。
Name of Most Complex Method(最复杂方法名):Main.main() ,程序入口方法复杂度最高。
Maximum Complexity(最大复杂度):8。
Average Complexity(平均复杂度):3.00 ,整体方法复杂度均值 。
深度相关
Line Number of Deepest Block(最深代码块所在行号):317 。
Maximum Block Depth(最大代码块深度):7 。
Average Block Depth(平均代码块深度):1.54 。

3.题集七






(1)加入了乘客类,储存并处理内外部乘客的请求,对内外请求管理更加有序
(3)复杂分析
行数(Lines):366 行,代码量适中但不算少,表明实现的功能有一定丰富度,可能涉及较多细节处理,理解和维护时需花费一定精力浏览代码。
语句数(Statements):156 条,说明代码中可执行操作数量不算多,可能代码逻辑结构相对紧凑,不过也可能存在语句较为复杂、一条语句实现多个功能的情况。
分支情况
分支语句占比(Percent Branch Statements):17.3% ,意味着代码中条件判断(如if - else、switch )和循环语句等分支逻辑占一定比例,这会使程序执行路径多样化,增加理解代码逻辑流向的难度。
方法调用情况
方法调用语句数(Calls):74 ,代码中方法间调用频繁,可能存在方法间耦合度过高的问题。
类结构
类和接口数量(Classes and Interfaces):4 个,表明代码进行了一定程度的模块化,通过不同类封装不同功能,但需审视类间关系是否合理、类的职责是否单一。
平均方法数 / 类(Methods/Class):5.75 。
方法复杂度
平均方法语句数(Average Statements per Method):5.70 ,说明方法平均代码量适中,但不能仅据此判断方法简单,可能存在部分方法代码集中、逻辑复杂的情况。
最复杂方法信息
最复杂方法所在行号(Line Number of Most Complex Method):297 行,对应最复杂方法位置,可针对此位置代码重点分析优化。
最大复杂度(Maximum Complexity):7 。
平均复杂度(Average Complexity):1.83 需要优化。
代码块深度
最深代码块所在行号(Line Number of Deepest Block):316 行,可定位到具有最深嵌套逻辑的代码位置。
最大代码块深度(Maximum Block Depth):5 ,代码中存在一定深度的逻辑嵌套(如循环嵌套、条件语句嵌套 )。
平均代码块深度(Average Block Depth):1.45。

三·采坑心得:

1.题集五一开始对电梯请求处理不够正确,逻辑比较混乱,梳理不够清晰。没看到后面发的样例之前,对内外请求判断有误,分不清是根据目标楼层判断方向还是根据外部请求中的方向为方向,一直在这绕。输出中的开门楼层出现错误,缺少了部分停靠楼层。
2.一开始运行自己的代码输出的最后一行有空行,但是所给样例没有,修改就是需要在开门停靠输出时加一个判断,判断是否还有其他请求。
3.在完成题集六时,每次测试样例按照这个情况分析,按样例运行时出现了电梯到达某一楼层时上到顶楼才改变方向去目标楼层开门的情况,输出会比实际要多一部分,可能是电梯方向还存在问题或者是与电梯状态混淆了,反复修改之后也没找到问题所在
4.题集七将内外请求归在乘客类里面逻辑更加清晰,职责分配更加明确
5.在第一层,初始电梯状态为NONE,但是输出时显示的方向也是NONE,给他调整了半天,如果先判断目标再输出,需要换方向的地方输出会有问题,如果先输出状态再判断方向,第一层又有问题,就给第一层初始方向换成了UP,后面又经过其他调试,还是对状态和方向的判断有缺陷
6.有时候在pta上运行,测试样例都符合了,但是提交却显示运行超时,找不到问题所在
7.题集五无法通过测试点,对后续作业答题的影响蛮大的,核心思路没变,但是就一直在自己的思路里面绕不出来,自己的问题还是比较大,思维不够开拓,可能还是有其他情况或者部分条件未考虑到

四·改进建议

1.建议题目增加一些输入输出样例加强对题目的理解,我们自己对题目分析的时候容易遗漏一些点,或者将有些点复杂化了,思路不够清晰
2.建议题目表达得更加通俗一点,有些抽象的东西理解起来不够清晰,会自我误导
3.题目提供的类图可以参考,帮我们梳理总体逻辑,整理思路线索
4.题目可以给出相关主函数,参考输入输出,让我们尽可能优化代码
5.希望在给足我们独立思考时间后老师可以提供部分代码思路,帮助我们解决逻辑上的问题
6.可以分配学习搭档,让基础薄弱的同学有更多的机会和基础好的同学打交道,相互讨论学习,与同学讨论也提高了我们自己的表达能力,讨论未果的题目再统一向老师发问,让我们在合作中更加高效的完成任务
7.在已经提交截止的题目里可能还是存在一些问题,易错点和需要注意的点还是会有很多,细节方面的知识还是希望老师能够指点一二,让我们代码更加规范得体

五·总结

1.学到了面对题目时,要先进行独立思考。面对复杂题目,不能够盲目开始,要精准分析找出题目中涉及到的类,明确相关职责,改变惯性思维,面对对象设计出类与方法之间的关系。例如,在电梯模拟系统的题目中,需要区分出乘客类、电梯类、请求队列类以及控制器类等,每个类各司其职,共同协作完成系统功能。
2.在题目的编程过程中,加深了对Java相关语法的运用。基础的变量定义、数据类型转换,到复杂的类与对象的创建、方法的重载与重写,在练习中对语法知识的进行实战演练。在实现各类功能时,能够根据具体需求灵活运用条件语句、循环语句来控制程序流程;
3.掌握新知识,学会了使用数组、集合(如 ArrayList、LinkedList、Queue)等数据结构来存储和管理数据。例如,在管理电梯请求队列时,选用 Queue 接口及其实现类 LinkedList,充分利用其高效的插入和删除操作特性,确保请求的处理顺畅有序。

4.对代码的调试还不够熟练,找不到自己代码中存在的错误。在使用 Eclipse、IntelliJ IDEA 这类开发工具时,不能熟练通过设置断点来逐步排查自己代码中存在的问题,导致排查错误时效率低下。之后我需要再额外花时间去学习如何调试,学习如何设置断点进行调试
5.对java的一些基础知识掌握还是不够深刻,还需要记住基本数据类型的特点和取值范围,还要理解它们在内存中的存储方式。对于引用数据类型,还不够清楚对象在堆内存中的分配以及引用变量在栈内存中的存储,要理解其中的引用传递的机制。
6.语法知识也需要多加练习实操,巩固练习复杂的面向对象编程特性,如类、对象、继承、多态,再到异常处理、泛型、注解等高级语法,每个知识点都需要通过实际编码来加深理解。不能遇到一点困难就失去信心,要努力找到问题根源并且解决。
posted @ 2025-04-20 13:58  桃玖  阅读(38)  评论(0)    收藏  举报