BLOG-1
第一次大作业结束,我从中学到了很多:
1.熟悉了Java基本语法;
2.初步建立起了面向对象的设计思路;
3.认识到了代码可拓展性的重要;
4.掌握了类的分析与使用。
题目集一
本题目侧重对于电梯下一楼层的判断,理解并设计电梯移动的优先级,分别分析内部请求和外部请求多种情况,以及根据电梯自行运行方向下电梯下一步要到达哪个楼层,还需要根据输入和输出格式做出相应优化。
源码设计:
源码设计的类:
电梯类(Elevator)请求类(Request)
电梯(Elevator)类:
class Elevator {
private int minfloor; //电梯最底层
private int maxfloor; //电梯最高层
private int currentfloor; //电梯当前楼层
private String direction;//电梯运行方向
private Queue<Integer> innerRequest; //电梯内部申请
private Queue<Request> externalRequest;//电梯外部申请
public Elevator(int minfloor, int maxfloor) //Elevator类的构造函数
public void enqueue(String scanner) //请求入队
public int nextfloor() //决策电梯的下一层
public void moveOneStep() //移动电梯
public void arriveAtFloor() //到达楼层后处理
private void removeCurrentFloorRequests()//到达楼层后清除请求
public void print() //普通状态输出
public void printf() //到达楼层输出
public int getcurrent() //获取当前楼层
public String direction() //获取电梯方向
public boolean hasInnerRequests() //获取内部请求
public boolean hasexternalRequests() //获取外部请求
public boolean hasRequests() //获取请求
public int innerpeek() //获取内部请求队首
public Request externalpeek() //获取外部请求队首
public Queue<Integer> getInnerRequestQueue() //操作内部队列
public Queue<Request> getExternalRequestQueue()//操作外部队列
}
请求(Request)类:
class Request {
private int floor;//外部楼层
private String exterdirection;//外部申请方向
public Request(int floor, String exterdirection) //Request类构造函数
public int getFloor() //获取外部楼层
public String getDirection() //获取外部申请方向
}
类图:

踩坑心得:
对电梯运行逻辑不熟悉,准确地找到电梯的下一层会比较吃力。
该题目输入的请求需要装入队列中,队列的先进先出能够很好的存储电梯内部和外部的请求。
题目中的输入用例会让电梯的运行方向多次变动需要在电梯变换方向的方面使用较多时间。
改进建议:
该次实验仅设置了Elevator类和request类两个类并将功能类方法全部堆放在一个类中,导致可读性较低不美观,出现问题时修改困难。
题目集二
本次题目在题目一上进行了设计格式上的更改,要求将各个模块细分并放在不同的类中,一个方法只实现一个功能,需要避免将全部功能放在一个类中
源码设计的类:
enum类、外部请求类(ExternalRequest类)、电梯类(Elevator)、控制类(Controller)、请求队列类(RequestQueue)
枚举类:
public enum Direction{
UP
DOWN
IDLE
}
public enum State{
MOVING
STOPPED
}
主类:
public static void main(String[] args)
ExternalRequest类:
private int floor;//外部请求楼层
private Direction direction //外部申请电梯方向
public ExternalRequest(int floor,Dierction direction)//类构造方法
public int getfloor()//获取楼层
public Direction getDirection()//获取方向
Elevator类
private int currentFloor;//电梯当前楼层
private Direction direction;//电梯方向
private State state;//电梯状态
private int maxFloor;//最高楼层
private int minFloor;//最低楼层
public Elevator(int minFloor,int maxFloor)//构造函数
public Elevator getElevatorInstance(int minFloor,int maxFloor)//获取电梯移动范围
public int getCurrentFloor()//获取当前楼层
public void setCurrentFloor(int currentFloor)
public Direction getDirection()//获取方向
public void setDirection(Direction direction)
public State getState()//获取当前楼层状态
public void setState(State state)
public int getMaxFloor()//获取电梯最高层
public int getMinFloor()//获取电梯最低层
public boolean isValiaFloor(int floor)//验证输入楼层是否有效
Controller类
private Elevator elevator
private RequestQueue queue
public Controller(Elevator elevator,RequestQueue requestqueue)
public Elevator getElevator()//获取电梯信息
public void setElevator(Elevator elevator)
public Queue<Request> getQueue()//获取请求队列
public void setQueue(Queue<Request> queue)
public void processRequests()// 处理所有请求
public void determineDirection() //确定电梯方向
public void move()//移动电梯
public boolean shouldStop(int floor)//判断是否停靠
public int getNextFloor()//获取下一个楼层
public int getClosest(int a,int b)//获取距离电梯最近的申请楼层
public void openDoors()//打开电梯门
private void removeRequests(int currentFloor) // 移除已处理的请求
RequestQueue类:
private LinkedList<int> internalRequests;
private LinkedList<ExternalRequest> externalReques;
public RequestQueue()//构造函数
public RequestQueue getQueueInstance()//获取队列长度
public LinkedList<int> getInternalRequests() // 获取内部请求队列
public LinkedList<ExternalRequest> getExternalRequests() // 获取外部请求队列
public void addInternalRequest(int floor) // 添加内部请求
public void addExternalRequest(int floor, Direction direction) // 添加外部请求
类图:

踩坑心得:
本次试题是将题目集一中的类做出了细化,并提供了类图作为设计参考,相较于题目集一中的电梯调度节省了类的设计的时间,但想要使用参考的类图还需要自行理解每个类中的每个方法的作用,需要更多时间。
本次题目需要将重复的请求过滤,需要在请求入队前将重复的请求过滤掉仅保留一个来避免电梯运行崩溃
根据输入样例与提交检测判断,该题目有先前往最近楼层的规律,与题目集一的电梯巡行逻辑有些许不同。
改进建议:
完全根据参考类图进行设计导致电梯调度的功能集中在Controller一个类中使得该类过于复杂,可以将部分功能再分出一个类,或将功能在其他类中使用额外的方法实现最后再在一个类中使用。
类的设计仅设计了外部请求的类,内部请求的内容直接放在了队列请求类中了,为方便后续修改,应为内部请求单独分出一个类
题目集三
本次题目在题目集二的电梯调度上做出了改变,将输入部分进行了更该,如果能将该次题目输入内容转化为题目集二的输入就能够较省力。
源码设计:
源码设计的类:
enum类、乘客类(passenger)、电梯类(Elevator)、请求队列类(RequestQueue)、控制类(Controller)
枚举类:
public enum Direction {
UP,
DOWN,
IDLE
}
public enum State {
MOVING,
STOPPED
}
Passenger类:
private Integer sourceFloor = null;
private Integer destinationFloor = null;
// 默认构造函数
public Passenger()
// 带参数的构造函数
public Passenger(Integer sourceFloor, Integer destinationFloor)
// 只有目标楼层的构造函数
public Passenger(Integer destinationFloor)
// Getter 和 Setter 方法
public Integer getSourceFloor()
public void setSourceFloor(Integer sourceFloor)
public Integer getDestinationFloor()
public void setDestinationFloor(Integer destinationFloor)
// 获取乘客方向
public Direction getDirection()
Elevator类:
private int currentFloor;
private Direction direction;
private State state;
private int maxFloor;
private int minFloor;
// 构造函数
public Elevator(int minFloor, int maxFloor)
// 单例模式获取电梯实例
public static Elevator getElevatorInstance(int minFloor, int maxFloor)
// Getter 和 Setter 方法
public int getCurrentFloor() //当前楼层
public void setCurrentFloor(int currentFloor)
public Direction getDirection() //电梯方向
public void setDirection(Direction direction)
public State getState() //电梯状态
public void setState(State state)
public int getMaxFloor()//最高楼层
public int getMinFloor() //最低楼层
// 验证楼层是否有效
public boolean isValidFloor(int floor)
RequestQueue类:
private LinkedList<Passenger> internalRequests = new LinkedList<>();
private LinkedList<Passenger> externalRequests = new LinkedList<>();
// 默认构造函数
public RequestQueue()
// 单例模式获取队列实例
public static RequestQueue getQueueInstance()
// Getter 和 Setter 方法
public LinkedList<Passenger> getInternalRequests() //获取内部请求
public void setInternalRequests(LinkedList<Passenger> internalRequests)
public LinkedList<Passenger> getExternalRequests() //获取外部请求
public void setExternalRequests(LinkedList<Passenger> externalRequests)
// 添加内部请求
public void addInternalRequest(Passenger passenger)
// 添加外部请求
public void addExternalRequest(Passenger passenger)
Controller类:
private Elevator elevator;
private RequestQueue queue;
// 默认构造函数
public Controller()
// 带参数的构造函数
public Controller(Elevator elevator, RequestQueue requestQueue)
// Getter 和 Setter 方法
public Elevator getElevator() //获取电梯信息
public void setElevator(Elevator elevator)
public RequestQueue getQueue() //获取请求队列
public void setQueue(RequestQueue queue)
// 处理请求
public void processRequests()
// 确定方向
public void determineDirection()
// 移动电梯
public void move()
// 判断是否停靠
public boolean shouldStop(int floor)
// 获取下一个楼层
public Integer getNextFloor()
// 获取最近的楼层
public Integer getClosest(Integer a, Integer b)
// 开门
public void openDoors()
// 移除请求
private void removeRequests(int currentFloor)
类图:

踩坑心得:这次得题目相较于前两次题目集中的输入内容改变了,将原本的外部乘客输入的方向改为了外部乘客的当前楼层和目标楼层,这需要使用额外的方法将乘客的两个输入转换为方向,转换成方向后就可以使用题目集二中电梯的运行逻辑
改进建议:
1.该代码就类的设计和输入较题目集二做出了改动,其他部分与题目集二的逻辑大体相同,没有做出创新性的改变
2.该代码未考虑电梯的边界(电梯限制在最高层和最低层之间),乘客输入超出边界的楼层无异常反馈
总结:
三次题目集总体来说是对Java编程能力的强化的一个循序渐进的模式,题目集一给出题目让我自己进行类的设计,这时的编程思维比较混乱,题目集二的电梯调度题目明确给出了要求每个类代表一个模块,不同模块的功能需要放在相应的类中,改掉了将所有功能塞进一个类中的习惯,这样不仅提高了代码的可读性还方便与后续对代码改动与优化,题目集三则对题目的输入要求和类进行了更改,让我不会将思维固化,能够灵活地根据题目要求对代码进行更改。这三次题目集很大的提高了我的编程能力和思考能力。

浙公网安备 33010602011771号