5-7电梯类题目总结
一、前言
对5-7电梯类题目集总结
-
为顺利解答电梯类题目集,需全面掌握以下核心知识点:
集合框架:熟练运用 ArrayList 和 LinkedList 集合;
字符串处理:精通字符串的各类操作,包括截取、拼接、查找与替换等,掌握字符串解析技巧,准确提取关键信息;
面向对象编程:深刻理解类与对象的概念,通过封装实现数据的隐藏与保护,合理运用方法重载增强代码的灵活性与可读性,借助私有方法实现类内部的特定功能,提升代码的模块化与安全性;
枚举类型:学会定义和使用枚举类型; -
对题目的感受:
题目量并不大,总共就是三题,第一次我得了100分,第二次我只拿了75分,第三次我得了100分
题目难度较大,题目层层递进,非常考验我的逻辑思维能力,但是做完之后让我收获颇丰,特别是通过测试点后那亮眼的满分令我感到振奋,加深了我对代码的兴趣和热爱
开始做第一次题目时,我的解题思路完全错误,想着就单纯以例题的情况进行分类,这样肯定考虑翁提不周全,结果显然没有做对,
然后问了作对题目的同班同学,请教他的算法是怎样的,然后思索再三,开发出了独属于我自己的一套算法:
第一步,按电梯的状态分为三种情况:【1】电梯初始时在一楼,方向向上 【2】电梯方向向上【3】电梯方向向下
第二步,再在第一步三种情况的每种情况里,分出三种情况:【1】外部请求外部请求方向向上【2】外部请求方向向下【3】外部请求为空
第三步,在第二部的三种情况的每种情况里,思考出电梯、外部请求、内部请求的楼层数的所有情况下电梯会执行什么行为,再把电梯执行相同行为的情况进行合并
这样,便把所有情况都考虑了进去,题目就做出来了
第二次题目和第三次题目就增加了一些需求,多分出了几个类,让我们的代码向面向对象思维靠拢,核心算法并没有改变,有了第一次题目的经验后,花费一些时间,优化自己的代码结构,便能做出来
二、设计与分析
- 第一次电梯类题目的设计与分析
题目要求:模拟电梯运行方式,编写出一个电梯类程序,底层逻辑为look算法,乘客请求分为外部请求和内部请求,每次先处理外部请求队列和内部请求队列的头部请求,删除处理完后请求,再来处理外部请求队列和内部请求队列的头部请求,以此类推,直到处理完所有请求。电梯类具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door
输入样例:
在这里给出一组输入。例如:
1
20
< 3,UP>
<5>
<6,DOWN>
<7>
<3>
end
输出样例:
在这里给出相应的输出。例如:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
第一次电梯类题目解题源码如下:
点击查看代码
import java.util.Scanner;
import java.util.ArrayList;
enum Direction {
UP, DOWN
}
class Elevator {
private int currentFloor;
private Direction currentDirection;
private int minFloor;
private int maxFloor;
private ArrayList<Integer> internalRequests;
private ArrayList<Integer> externalRequests;
private ArrayList<Direction> directions;
public Elevator(int minFloor, int maxFloor) {
this.currentFloor = minFloor;
this.currentDirection = Direction.UP;
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.internalRequests = new ArrayList<>();
this.externalRequests = new ArrayList<>();
this.directions = new ArrayList<>();
}
public void addInternalRequest(int floor) {
internalRequests.add(floor);
}
public void addExternalRequest(int floor, Direction direction) {
externalRequests.add(floor);
directions.add(direction);
}
public ArrayList<Integer> getInternalRequests() {
return internalRequests;
}
public ArrayList<Integer> getExternalRequests() {
return externalRequests;
}
public void processFirstRequests(){
if(!getExternalRequests().isEmpty()&&directions.get(0)==Direction.DOWN) {
if (!getInternalRequests().isEmpty()) {
a();
}
else if (getInternalRequests().isEmpty()) {
b();
}
}
else if(!getExternalRequests().isEmpty()&&directions.get(0)==Direction.UP){
if(!getInternalRequests().isEmpty()&&internalRequests.get(0)>externalRequests.get(0)){
b();
}
else if(!getInternalRequests().isEmpty()&&internalRequests.get(0)<externalRequests.get(0)){
a();
}
else if(!getInternalRequests().isEmpty()&&internalRequests.get(0).equals(externalRequests.get(0))){
b();
internalRequests.remove(0);
}
}
else if(getExternalRequests().isEmpty()) {
a();
}
}
private void a(){
elevatorUp(internalRequests.get(0));
handleStop2(internalRequests.remove(0));
}
private void b(){
elevatorUp(externalRequests.get(0));
handleStop2(externalRequests.remove (0));
directions.remove(0);
}
public void processRequests() {
while(!getInternalRequests().isEmpty() || !getExternalRequests().isEmpty()){
if(currentDirection==Direction.UP) {
if (!getExternalRequests().isEmpty() && directions.get(0) == Direction.UP) {
if ((!getInternalRequests().isEmpty() && internalRequests.get(0) > currentFloor&& currentFloor>externalRequests.get(0))||(!getInternalRequests().isEmpty() && currentFloor < internalRequests.get(0)&& internalRequests.get(0) < externalRequests.get(0))) {
printInterup();
continue;
}
else if ((!getInternalRequests().isEmpty() && internalRequests.get(0) < currentFloor&& currentFloor<externalRequests.get(0))||(!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0))||(getInternalRequests().isEmpty() && currentFloor<externalRequests.get(0))) {
printExertup();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExertup();
internalRequests.remove(0);
continue;
}
else if ((!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0))||(getInternalRequests().isEmpty() && currentFloor>externalRequests.get(0))) {
printExterdown();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterdown();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExterdown();
internalRequests.remove(0);
continue;
}
else if(!getInternalRequests().isEmpty() && currentFloor==externalRequests.get(0)&¤tFloor!=internalRequests.get(0)) {
handleStop3(externalRequests.remove (0));
directions.remove(0);
continue;
}
else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor&¤tFloor!=externalRequests.get(0)) {
handleStop3(internalRequests.remove (0));
continue;
}
else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor&¤tFloor==externalRequests.get(0)) {
handleStop3(externalRequests.remove (0));
directions.remove(0);
internalRequests.remove (0);
continue;
}
else if (getInternalRequests().isEmpty() && currentFloor==externalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
}
}
else if (!getExternalRequests().isEmpty() && directions.get(0) == Direction.DOWN) {
if (!getInternalRequests().isEmpty() && internalRequests.get(0) > currentFloor && currentFloor > externalRequests.get(0)) {
printInterup();
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) < currentFloor && currentFloor < externalRequests.get(0)) {
printExertup();
currentDirection = Direction.DOWN;
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printInterup();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterup();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExertup();
internalRequests.remove(0);
currentDirection = Direction.DOWN;
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printExterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExterdown();
internalRequests.remove(0);
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)&¤tFloor<internalRequests.get(0)) {
printInterup();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)&¤tFloor>internalRequests.get(0)) {
currentDirection = Direction.DOWN;
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor&¤tFloor!=externalRequests.get(0)) {
handleStop3(internalRequests.remove(0));
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor && currentFloor == externalRequests.get(0)) {
currentDirection = Direction.DOWN;
handleStop3(externalRequests.remove(0));
directions.remove(0);
internalRequests.remove(0);
continue;
} else if (getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0)) {
printExterdown();
continue;
} else if (getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0)) {
printExertup();
currentDirection = Direction.DOWN;
continue;
} else if (getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
}
}
else if (getExternalRequests().isEmpty()) {
if(internalRequests.get(0)>currentFloor){
printInterup();
continue;
}
else if(internalRequests.get(0)<currentFloor){
printInterdown();
continue;
}
else if(internalRequests.get(0)==currentFloor){
handleStop3(internalRequests.remove(0));
continue;
}
}
}
else if(currentDirection==Direction.DOWN) {
if (!getExternalRequests().isEmpty() && directions.get(0) == Direction.UP) {
if (!getInternalRequests().isEmpty() && internalRequests.get(0) > currentFloor && currentFloor > externalRequests.get(0)) {
printExterdown();
currentDirection = Direction.UP;
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) < currentFloor && currentFloor < externalRequests.get(0)) {
printInterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printInterup();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printExertup();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExertup();
internalRequests.remove(0);
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printInterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterdown();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExterdown();
internalRequests.remove(0);
currentDirection = Direction.UP;
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0) && currentFloor > internalRequests.get(0)) {
printInterdown();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0) && currentFloor < internalRequests.get(0)) {
currentDirection = Direction.UP;
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
}
else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor && currentFloor != externalRequests.get(0)) {
handleStop3(internalRequests.remove(0));
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor && currentFloor == externalRequests.get(0)) {
currentDirection = Direction.UP;
handleStop3(externalRequests.remove(0));
directions.remove(0);
internalRequests.remove(0);
continue;
} else if (getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0)) {
printExterdown();
currentDirection = Direction.UP;
continue;
} else if (getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0)) {
printExertup();
continue;
} else if (getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)) {
currentDirection = Direction.UP;
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
}
}
else if (!getExternalRequests().isEmpty() && directions.get(0) == Direction.DOWN) {
if (!getInternalRequests().isEmpty() && internalRequests.get(0) > currentFloor && currentFloor > externalRequests.get(0)) {
printExterdown();
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) < currentFloor && currentFloor < externalRequests.get(0)) {
printInterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printInterup();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterup();
continue;
}
else if (!getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExertup();
internalRequests.remove(0);
currentDirection = Direction.DOWN;
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0)) {
printExterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0)) {
printInterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0) && internalRequests.get(0).equals(externalRequests.get(0))) {
printExterdown();
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0) && currentFloor < internalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
} else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0) && currentFloor > internalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor && currentFloor != externalRequests.get(0)) {
currentDirection = Direction.UP;
handleStop3(internalRequests.remove(0));
continue;
} else if (!getInternalRequests().isEmpty() && internalRequests.get(0) == currentFloor && currentFloor == externalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
internalRequests.remove(0);
continue;
} else if (getInternalRequests().isEmpty() && currentFloor > externalRequests.get(0)) {
printExterdown();
continue;
} else if (getInternalRequests().isEmpty() && currentFloor < externalRequests.get(0)) {
printExertup();
currentDirection = Direction.DOWN;
continue;
} else if (getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)) {
handleStop3(externalRequests.remove(0));
directions.remove(0);
continue;
}
}
else if (getExternalRequests().isEmpty()) {
if (internalRequests.get(0) > currentFloor) {
printInterup();
continue;
} else if (internalRequests.get(0) < currentFloor) {
printInterdown();
continue;
} else if (internalRequests.get(0) == currentFloor) {
handleStop3(internalRequests.remove(0));
continue;
}
}
}
}
}
private void handleStope1(int floor){
System.out.println("Current Floor: " + floor + " Direction: " + currentDirection);
}
private void handleStop2(int floor) {
System.out.println("Current Floor: " + floor + " Direction: " + currentDirection);
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void handleStop3(int floor){
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void elevatorUp(int floor){
while(currentFloor<floor) {
handleStope1(currentFloor);
currentFloor++;
}
}
private void elevatorDown(int floor){
while(currentFloor>floor){
handleStope1(currentFloor);
currentFloor--;
}
}
private void printInterup(){
currentDirection=Direction.UP;
currentFloor++;
elevatorUp(internalRequests.get(0));
handleStop2(internalRequests.remove(0));
}
private void printInterdown(){
currentDirection = Direction.DOWN;
currentFloor--;
elevatorDown(internalRequests.get(0));
handleStop2(internalRequests.remove(0));
}
private void printExertup(){
currentDirection = Direction.UP;
currentFloor++;
elevatorUp(externalRequests.get(0));
handleStop2(externalRequests.remove(0));
directions.remove(0);
}
private void printExterdown(){
currentDirection=Direction.DOWN;
currentFloor--;
elevatorDown(externalRequests.get(0));
handleStop2(externalRequests.remove (0));
directions.remove(0);
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String data;
int floor = 0;
Direction direction = null;
int minFloor, maxFloor;
String request = "";
ArrayList<String> list = new ArrayList<>();
data = input.next();
while (!data.equalsIgnoreCase("End")) {
list.add(data);
data = input.next();
}
minFloor = Integer.parseInt(list.get(0));
maxFloor = Integer.parseInt(list.get(1));
Elevator elevator = new Elevator(minFloor, maxFloor);
for (int i = 2; i < list.size(); i++) {
request = list.get(i);
if (request.contains(",")) {
if (!request.matches("<\\d+,\\s*(UP|DOWN)>")) {
System.out.println("Wrong Format");
}
String[] parts = request.replaceAll("[<>]", "").split(",");
floor = Integer.parseInt(parts[0].trim());
direction = Direction.valueOf(parts[1].trim().toUpperCase());
elevator.addExternalRequest(floor, direction);
} else {
if (!request.matches("<\\d+>")) {
System.out.println("Wrong Format");
}
floor = Integer.parseInt(request.replaceAll("[<>]", ""));
elevator.addInternalRequest(floor);
}
}
elevator.processFirstRequests();
elevator.processRequests();
input.close();
}
}
解题思路(核心算法):
第一步,按电梯的状态分为三种情况:【1】电梯初始时在一楼,方向向上 【2】电梯方向向上【3】电梯方向向下;
第二步,再在第一步三种情况的每种情况里,分出三种情况:【1】外部请求外部请求方向向上【2】外部请求方向向下【3】外部请求为空;
第三步,在第二部的三种情况的每种情况里,思考出电梯、外部请求、内部请求的楼层数的所有情况下电梯会执行什么行为,再把电梯执行相同行为的情况进行合并。
代码的类图如下:

类的总体设计思路:
Direction 类:
这是一个枚举类(«Enum»),定义了两个枚举常量 UP 和 DOWN,用于表示电梯的运行方向(上行或下行)。
Main 类:
包含 main 方法(程序入口),作为程序启动的起点,负责执行程序逻辑。
Elevator 类:
核心类,用于管理电梯的状态与行为。
属性:记录当前楼层(currentFloor)、当前方向(currentDirection)、最小楼层(minFloor)、最大楼层(maxFloor),以及内部请求列表(internalRequests)、外部请求列表(externalRequests)和方向数组(directions)。
方法:
构造函数 Elevator(int minFloor, int maxFloor):初始化电梯的最小和最大楼层。
addInternalRequest 和 addExternalRequest:分别用于添加内部(轿厢内)和外部(楼层按钮)的请求。
processFirstRequests 和 processRequests:处理请求逻辑,控制电梯运行。
handleStop1、handleStop2、handleStop3:处理电梯停靠相关操作。
elevatorUp 和 elevatorDown:控制电梯上行或下行。
打印方法(如 printInterup 等):用于输出电梯运行的相关信息。
代码的Source Monitor分析结果如下:

由此分析出我的代码:
注释缺失:% Comments 为 0.0%,完全没有注释,代码可读性差,不利于他人理解与后期维护。
复杂度极高:Max Complexity 达 183,远超合理范围,表明部分方法逻辑极复杂,维护难度大;Avg Complexity 为 11.68,整体复杂度也偏高。
方法与类设计:Avg Stmts/Method 为 13.79,单方法语句数较多;Methods/Class 达 6.33,类中方法数偏多,存在类职责不单一、方法功能臃肿的问题。
分支与调用:% Branches 为 29.4%,条件判断较多,逻辑较复杂;Calls 达 477,方法间调用频繁,代码结构可能不够清晰。
总体分析:
面向对象设计问题
职责混杂:Elevator 类集成状态管理、请求处理、输出等功能,复杂度高。需拆分输入解析、输出等功能到独立类,遵循单一职责。
方法臃肿:核心方法嵌套大量条件判断,逻辑复杂。应提取通用逻辑为独立方法,减少冗余与嵌套。
复杂度失控
条件爆炸:多层 if-else 枚举场景,未抽象调度规则(如同向优先),可读性差。
算法缺失:硬编码实现调度逻辑,未提炼为通用算法,扩展性不足。
可读性与维护性
没有注释:关键逻辑没有说明,复盘困难,需补充设计思路与边界条件的注释。
命名不规范:方法名(如 a())含义不清,需使用语义化命名(如 handleUpwardRequest),提升自解释性。
工程实践短板
校验不足:未处理无效楼层、重复请求等边界情况,存在运行风险。
优化方向
解耦与模式:分离电梯状态与行为,将elevater类分成多个类,处理不同调度策略,避免硬编码。
迭代开发:先实现核心逻辑(如单向请求),再逐步扩展,最终达到覆盖所有情况的目的,避免一次性堆砌代码。
总结:我应该要明白代码清晰性优于功能速成,需通过抽象、分层设计和模式简化逻辑。我未来应重视类图设计、及时重构、注释命名及单元测试,提升代码健壮性与可维护性。
- 第二次电梯类题目的设计和分析
电梯运行规则与第一次电梯类题目相同,对第一次电梯类进行迭代性设计,使得类设计符合单一职责原则,继续执行,包含但不限于乘客请求类、电梯类、请求队列类及控制类,其中控制类专门负责电梯调度过程,
同时要处理如下情况:
乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,
乘客请求不合理,具体为输入时出现连续的相同请求,例如<3><3><3>或者<5,DOWN><5,DOWN>,处理方法:程序自动忽略相同的多余输入,继续执行,例如<3><3><3>过滤为<3>
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door
输入样例1:
在这里给出一组输入。例如:
1
20
< 3,UP>
<5>
<6,DOWN>
<7>
<3>
end
输出样例1:
在这里给出相应的输出。例如:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
输入样例2:
在这里给出一组输入。例如:
1
20
< 3,UP>
< 3,UP>
<5>
<5>
<5>
<6,DOWN>
<7>
<7>
<3>
<22,DOWN>
<5,DOWN>
<30>
END
输出样例2:
在这里给出相应的输出。例如:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Open Door # Floor 5
Close Door
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
第二次电梯类题目解题源码如下:
点击查看代码
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
enum Direction {
UP, DOWN, IDLE
}
class ExternalRequest {
private int floor;
private Direction direction;
public ExternalRequest(int floor, Direction direction) {
this.floor = floor;
this.direction = direction;
}
public int getFloor() {
return this.floor;
}
public Direction getDirection() {
return this.direction;
}
}
class Elevator {
private int currentFloor;
private Direction direction;
private int minFloor;
private int maxFloor;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
this.direction = Direction.IDLE;
}
public int getCurrentFloor() {
return currentFloor;
}
public Direction getDirection() {
return direction;
}
public void setCurrentFloor(int currentFloor) {
this.currentFloor = currentFloor;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
public boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
}
class RequestQueue {
private List<Integer> internalRequests = new LinkedList<>();
private List<ExternalRequest> externalRequests = new LinkedList<>();
public RequestQueue() {}
public List<Integer> getInternalRequests() {
return internalRequests;
}
public void setInternalRequests(List<Integer> internalRequests) {
this.internalRequests = internalRequests;
}
public void addInternalRequest(int floor) {
internalRequests.add(floor);
}
public List<ExternalRequest> getExternalRequests() {
return externalRequests;
}
public void setExternalRequests(List<ExternalRequest> externalRequests) {
this.externalRequests = externalRequests;
}
public void addExternalRequest(int floor, Direction direction) {
externalRequests.add(new ExternalRequest(floor, direction));
}
}
class Controller {
private Elevator elevator;
private RequestQueue queue;
public Controller(Elevator elevator, RequestQueue requestQueue) {
this.elevator = elevator;
this.queue = requestQueue;
}
public void processRequests() {
List<Integer> internalRequests = queue.getInternalRequests();
List<ExternalRequest> externalRequests = queue.getExternalRequests();
while (!internalRequests.isEmpty() || !externalRequests.isEmpty()) {
Direction currentDirection = elevator.getDirection();
if (currentDirection == Direction.IDLE) {
handleFirstDirection(externalRequests, internalRequests);
} else if (currentDirection == Direction.UP) {
handleUpDirection(externalRequests, internalRequests);
} else if (currentDirection == Direction.DOWN) {
handleDownDirection(externalRequests, internalRequests);
}
}
}
private void handleFirstDirection(List<ExternalRequest> externalRequests, List<Integer> internalRequests) {
elevator.setDirection(Direction.UP);
if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.DOWN) {
if (!internalRequests.isEmpty()) {
a();
} else if (internalRequests.isEmpty()) {
b();
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.UP) {
if (!internalRequests.isEmpty() && internalRequests.get(0) > externalRequests.get(0).getFloor()) {
b();
} else if (!internalRequests.isEmpty() && internalRequests.get(0) < externalRequests.get(0).getFloor()) {
a();
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == externalRequests.get(0).getFloor()) {
b();
internalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
a();
}
}
private void handleUpDirection(List<ExternalRequest> externalRequests, List<Integer> internalRequests) {
if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.UP) {
if ((!internalRequests.isEmpty() && internalRequests.get(0) > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0).getFloor())) {
printInterup();
} else if ((!internalRequests.isEmpty() && internalRequests.get(0) < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0) > externalRequests.get(0).getFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor())) {
printExertup();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExertup();
internalRequests.remove(0);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0) < externalRequests.get(0).getFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor())) {
printExterdown();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0).getFloor()) {
printInterdown();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExterdown();
internalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() != internalRequests.get(0)) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getFloor()) {
handleStop3(internalRequests.remove(0));
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.DOWN) {
if ((!internalRequests.isEmpty() && internalRequests.get(0) > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0) > externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() < internalRequests.get(0))) {
printInterup();
} else if (!internalRequests.isEmpty() && internalRequests.get(0) < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor()) {
printExertup();
elevator.setDirection(Direction.DOWN);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExertup();
internalRequests.remove(0);
elevator.setDirection(Direction.DOWN);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0) < externalRequests.get(0).getFloor())||(internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor())) {
printExterdown();
}
else if((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor()))){
printExterdown();
internalRequests.remove(0);
}
else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0).getFloor()) {
printInterdown();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() > internalRequests.get(0)) {
elevator.setDirection(Direction.DOWN);
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getFloor()) {
handleStop3(internalRequests.remove(0));
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
elevator.setDirection(Direction.DOWN);
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor()) {
printExertup();
elevator.setDirection(Direction.DOWN);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
if (internalRequests.get(0) > elevator.getCurrentFloor()) {
printInterup();
} else if (internalRequests.get(0) < elevator.getCurrentFloor()) {
printInterdown();
} else if (internalRequests.get(0) == elevator.getCurrentFloor()) {
handleStop3(internalRequests.remove(0));
}
}
}
private void handleDownDirection(List<ExternalRequest> externalRequests, List<Integer> internalRequests) {
if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.UP) {
if (!internalRequests.isEmpty() && internalRequests.get(0) > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor()) {
printExterdown();
elevator.setDirection(Direction.UP);
} else if ((!internalRequests.isEmpty() && internalRequests.get(0) < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor())|| (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0) < externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() > internalRequests.get(0))) {
printInterdown();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0).getFloor()) {
printInterup();
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0) > externalRequests.get(0).getFloor())||(internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor())) {
printExertup();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExertup();
internalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExterdown();
internalRequests.remove(0);
elevator.setDirection(Direction.UP);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() < internalRequests.get(0)) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getFloor()) {
handleStop3(internalRequests.remove(0));
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor()) {
printExterdown();
elevator.setDirection(Direction.UP);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDirection() == Direction.DOWN) {
if ((!internalRequests.isEmpty() && internalRequests.get(0) > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0) < externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor()))||(internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getFloor())) {
printExterdown();
} else if ((!internalRequests.isEmpty() && internalRequests.get(0) < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0) && internalRequests.get(0) > externalRequests.get(0).getFloor())) {
printInterdown();
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0) && internalRequests.get(0) < externalRequests.get(0).getFloor())||(!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0) > externalRequests.get(0).getFloor())) {
printInterup();
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor() && internalRequests.get(0).equals(externalRequests.get(0).getFloor())) {
printExertup();
internalRequests.remove(0);
elevator.setDirection(Direction.DOWN);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() < internalRequests.get(0)) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor() && elevator.getCurrentFloor() > internalRequests.get(0)) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(internalRequests.remove(0));
} else if (!internalRequests.isEmpty() && internalRequests.get(0) == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getFloor()) {
printExertup();
elevator.setDirection(Direction.DOWN);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getFloor()) {
handleStop3(externalRequests.get(0).getFloor());
externalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
if (internalRequests.get(0) > elevator.getCurrentFloor()) {
printInterup();
} else if (internalRequests.get(0) < elevator.getCurrentFloor()) {
printInterdown();
} else if (internalRequests.get(0) == elevator.getCurrentFloor()) {
handleStop3(internalRequests.remove(0));
}
}
}
private void handleStope1(int floor) {
System.out.println("Current Floor: " + floor + " Direction: " + elevator.getDirection());
}
private void handleStop2(int floor) {
System.out.println("Current Floor: " + floor + " Direction: " + elevator.getDirection());
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void handleStop3(int floor) {
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void elevatorUp(int floor) {
while (elevator.getCurrentFloor() < floor) {
handleStope1(elevator.getCurrentFloor());
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
}
}
private void elevatorDown(int floor) {
while (elevator.getCurrentFloor() > floor) {
handleStope1(elevator.getCurrentFloor());
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
}
}
private void a(){
elevatorUp(queue.getInternalRequests().get(0));
handleStop2(queue.getInternalRequests().remove(0));
}
private void b(){
elevatorUp(queue.getExternalRequests().get(0).getFloor());
handleStop2(queue.getExternalRequests().get(0).getFloor());
queue.getExternalRequests().remove(0);
}
private void printInterup(){
elevator.setDirection(Direction.UP);
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
elevatorUp(queue.getInternalRequests().get(0));
handleStop2(queue.getInternalRequests().remove(0));
}
private void printInterdown(){
elevator.setDirection(Direction.DOWN);
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
elevatorDown(queue.getInternalRequests().get(0));
handleStop2(queue.getInternalRequests().remove(0));
}
private void printExertup(){
elevator.setDirection(Direction.UP);
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
elevatorUp(queue.getExternalRequests().get(0).getFloor());
handleStop2(queue.getExternalRequests().get(0).getFloor());
queue.getExternalRequests().remove(0);
}
private void printExterdown(){
elevator.setDirection(Direction.DOWN);
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
elevatorDown(queue.getExternalRequests().get(0).getFloor());
handleStop2(queue.getExternalRequests().get(0).getFloor());
queue.getExternalRequests().remove(0);
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String data;
int floor = 0;
Direction direction = null;
int minFloor, maxFloor;
String request = "";
LinkedList<String> list = new LinkedList<>();
data = input.next();
while (!data.equalsIgnoreCase("End")) {
list.add(data);
data = input.next();
}
minFloor = Integer.parseInt(list.get(0));
maxFloor = Integer.parseInt(list.get(1));
Elevator elevator = new Elevator(minFloor, maxFloor);
RequestQueue requestQueue = new RequestQueue();
String prevRequest_1 = "";
for (int i = 2; i < list.size(); i++) {
request = list.get(i);
if (request.contains(",")) {
if (!request.matches("<\\d+,\\s*(UP|DOWN)>")) {
System.out.println("Wrong Format");
continue;
}
String[] parts = request.replaceAll("[<>]", "").split(",");
floor = Integer.parseInt(parts[0].trim());
direction = Direction.valueOf(parts[1].trim().toUpperCase());
if (floor < minFloor || floor > maxFloor) {
continue;
}
if (request.equals(prevRequest_1)) {
continue;
}
requestQueue.addExternalRequest(floor, direction);
prevRequest_1 = request;
}
}
String prevRequest_2 = "";
for (int i = 2; i < list.size(); i++) {
request = list.get(i);
if (!request.contains(",")) {
if (!request.matches("<\\d+>")) {
System.out.println("Wrong Format");
continue;
}
floor = Integer.parseInt(request.replaceAll("[<>]", ""));
if (floor < minFloor || floor > maxFloor) {
continue;
}
if (request.equals(prevRequest_2)) {
continue;
}
requestQueue.addInternalRequest(floor);
prevRequest_2 = request;
}
}
Controller controller = new Controller(elevator, requestQueue);
controller.processRequests();
input.close();
}
}
核心算法(思路):
第一步,按电梯的状态分为三种情况:【1】电梯初始时在一楼,方向向上 【2】电梯方向向上【3】电梯方向向下;
第二步,再在第一步三种情况的每种情况里,分出三种情况:【1】外部请求外部请求方向向上【2】外部请求方向向下【3】外部请求为空;
第三步,在第二部的三种情况的每种情况里,思考出电梯、外部请求、内部请求的楼层数的所有情况下电梯会执行什么行为,再把电梯执行相同行为的情况进行合并。
代码的类图如下:

类的总体设计思路:
Elevator 类:封装电梯状态(当前楼层、运行方向、最小 / 最大楼层),提供楼层设置、方向设置及楼层有效性检查等方法,聚焦电梯基础状态管理。
Direction 枚举:定义电梯运行方向(上行、下行、空闲),为系统提供统一方向标识。
RequestQueue 类:装载内部请求(楼层列表)与外部请求(包含楼层和方向的ExternalRequest对象列表),提供添加和设置请求的方法,集中管理各类请求。
ExternalRequest 类:表示外部请求,记录请求楼层与方向,封装数据便于处理。
Controller 类:接收电梯实例与请求队列,包含处理请求(processRequests)、控制电梯启停及运行方向(如elevatorUp/elevelevatorDown`)等方法,实现电梯运行逻辑的集中控制。
Main 类:作为程序入口,启动系统。
代码的Source Monitor分析结果如下:

由此可分析出我的代码:
注释情况:
% Comments 为 0.0,完全没有注释,严重影响代码可读性,建议补充注释说明逻辑、参数、返回值等。
代码复杂度:
Max Complexity 高达 93,表明方法极为复杂(含大量条件判断、循环嵌套等),难以理解与测试。
Avg Complexity 为 7.52,整体复杂度偏高,需拆分复杂方法,遵循单一职责原则。
分支覆盖率:
% Branches 为 25.0,说明代码中仅 25% 的分支逻辑被覆盖,测试不充分,存在潜在风险,需加强测试用例。
方法与调用:
Methods/Class 为 5.50,类的职责可能不够单一。
Calls 达 583,方法间调用频繁,需检查是否存在冗余调用,优化代码结构。
总体分析:
注释缺失:% Comments = 0.0,关键逻辑(如handleFirstDirection中的条件判断)无注释,可读性极差。
方法复杂度太大:Max Complexity = 93(如handleUpDirection和handleDownDirection),大量嵌套条件判断(if-else)和重复逻辑,违反 “单一职责原则”,难以调试和扩展。
冗余代码:如printInterup、printExterdown等方法逻辑重复,可简化。
分支覆盖率低:% Branches = 25.0,说明仅 1/4 的条件分支被测试覆盖,存在大量未验证逻辑(如边界条件、请求冲突场景),潜在 bug 风险高。
方法命名不规范:如a()、b()无意义命名,elevvelevatorDown拼写错误(应为elevatorDown),违反驼峰命名和可读性原则。
状态变更逻辑分散:电梯方向(direction)和当前楼层(currentFloor)的变更逻辑散落在多个方法中,未统一管理。
总结:我的代码虽然具备电梯控制的核心逻辑框架,类设计思路合理,但存在严重的可维护性问题(高复杂度、无注释、结构臃肿)和潜在缺陷(测试不足、代码规范问题)。需优先重构复杂方法、补充注释,并通过设计模式简化逻辑,以提升代码质量和可扩展性。
3.第三次电梯类题目设计和分析:
题目要求:对之前电梯调度程序再次进行迭代性设计,加入乘客类(Passenger),取消乘客请求类,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客类、队列类以及控制类,
电梯运行规则与前阶段相同,但有如下变动情况:
乘客请求输入变动情况:外部请求由之前的<请求楼层数,请求方向>修改为<请求源楼层,请求目的楼层>
对于外部请求,当电梯处理该请求之后(该请求出队),要将<请求源楼层,请求目的楼层>中的请求目的楼层加入到请求内部队列(加到队尾)
输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<请求源楼层,请求目的楼层>,其中,请求源楼层表示乘客发起请求所在的楼层,请求目的楼层表示乘客想要到达的楼层。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door
输入样例1:
在这里给出一组输入。例如:
1
20
<5,4>
<5>
<7>
end
输出样例1:
在这里给出相应的输出。例如:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Current Floor: 5 Direction: DOWN
Open Door # Floor 5
Close Door
Current Floor: 4 Direction: DOWN
Open Door # Floor 4
Close Door
输入样例2:
在这里给出一组输入。例如:
1
20
<5,9>
<8>
<9,3>
<4>
<2>
end
输出样例2:
在这里给出相应的输出。例如:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Current Floor: 8 Direction: UP
Open Door # Floor 8
Close Door
Current Floor: 9 Direction: UP
Open Door # Floor 9
Close Door
Current Floor: 8 Direction: DOWN
Current Floor: 7 Direction: DOWN
Current Floor: 6 Direction: DOWN
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Open Door # Floor 4
Close Door
Current Floor: 3 Direction: DOWN
Current Floor: 2 Direction: DOWN
Open Door # Floor 2
Close Door
Current Floor: 3 Direction: UP
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Current Floor: 8 Direction: UP
Current Floor: 9 Direction: UP
Open Door # Floor 9
Close Door
Current Floor: 8 Direction: DOWN
Current Floor: 7 Direction: DOWN
Current Floor: 6 Direction: DOWN
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door
解题源码如下:
点击查看代码
import java.util.LinkedList;
import java.util.Scanner;
enum Direction {
UP,
DOWN,
IDLE
}
class Elevator {
private int currentFloor;
private Direction direction;
private int maxFloor;
private int minFloor;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
this.currentFloor = minFloor;
this.direction = Direction.IDLE;
}
public static Elevator getElevatorInstance(int minFloor, int maxFloor) {
return new Elevator(minFloor, maxFloor);
}
public int getCurrentFloor() {
return currentFloor;
}
public void setCurrentFloor(int currentFloor) {
this.currentFloor = currentFloor;
}
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
public int getMaxFloor() {
return maxFloor;
}
public int getMinFloor() {
return minFloor;
}
public boolean isValidFloor(int floor) {
return floor >= minFloor && floor <= maxFloor;
}
}
class Passenger {
private Integer sourceFloor = null;
private Integer destinationFloor = null;
public Passenger(Integer sourceFloor, Integer destinationFloor) {
this.sourceFloor = sourceFloor;
this.destinationFloor = destinationFloor;
}
public Passenger(Integer destinationFloor) {
this.destinationFloor = destinationFloor;
}
public Integer getSourceFloor() {
return sourceFloor;
}
public void setSourceFloor(Integer sourceFloor) {
this.sourceFloor = sourceFloor;
}
public Integer getDestinationFloor() {
return destinationFloor;
}
public void setDestinationFloor(Integer destinationFloor) {
this.destinationFloor = destinationFloor;
}
public Direction getDestinationDirection() {
if (destinationFloor > sourceFloor) {
return Direction.UP;
} else if (destinationFloor < sourceFloor) {
return Direction.DOWN;
}
return Direction.IDLE;
}
}
class RequestQueue {
private LinkedList<Passenger> internalRequests = new LinkedList<>();
private LinkedList<Passenger> externalRequests = new LinkedList<>();
public static RequestQueue getQueueInstance() {
return new RequestQueue();
}
public LinkedList<Passenger> getInternalRequests() {
return internalRequests;
}
public void setInternalRequests(LinkedList<Passenger> internalRequests) {
this.internalRequests = internalRequests;
}
public LinkedList<Passenger> getExternalRequests() {
return externalRequests;
}
public void setExternalRequests(LinkedList<Passenger> externalRequests) {
this.externalRequests = externalRequests;
}
public void addInternalRequest(Passenger passenger) {
internalRequests.add(passenger);
}
public void addExternalRequest(Passenger passenger) {
externalRequests.add(passenger);
}
}
class Controller {
private Elevator elevator;
private RequestQueue queue;
public Controller() {
}
public Controller(Elevator elevator, RequestQueue requestQueue) {
this.elevator = elevator;
this.queue = requestQueue;
}
public Elevator getElevator() {
return elevator;
}
public void setElevator(Elevator elevator) {
this.elevator = elevator;
}
public RequestQueue getQueue() {
return queue;
}
public void setQueue(RequestQueue queue) {
this.queue = queue;
}
public void processRequests() {
LinkedList<Passenger> internalRequests = queue.getInternalRequests();
LinkedList<Passenger> externalRequests = queue.getExternalRequests();
while (!internalRequests.isEmpty() || !externalRequests.isEmpty()) {
Direction currentDirection = elevator.getDirection();
if (currentDirection == Direction.IDLE) {
handleFirstDirection(externalRequests, internalRequests);
} else if (currentDirection == Direction.UP) {
handleUpDirection(externalRequests, internalRequests);
} else if (currentDirection == Direction.DOWN) {
handleDownDirection(externalRequests, internalRequests);
}
}
}
private void handleFirstDirection(LinkedList<Passenger> externalRequests, LinkedList<Passenger> internalRequests) {
elevator.setDirection(Direction.UP);
if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.DOWN) {
if (!internalRequests.isEmpty()) {
a(internalRequests);
} else if (internalRequests.isEmpty()) {
b(externalRequests);
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.UP) {
if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) {
b(externalRequests);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) {
a(internalRequests);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
b(externalRequests);
internalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
a(internalRequests);
}
}
private void handleUpDirection(LinkedList<Passenger> externalRequests, LinkedList<Passenger> internalRequests) {
if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.UP) {
if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor())) {
printInterup(internalRequests);
} else if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
internalRequests.remove(0);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor())) {
printExterdown(externalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) {
printInterdown(internalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExterdown(externalRequests);
internalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() != internalRequests.get(0).getDestinationFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getSourceFloor()) {
handleStop3(internalRequests.remove(0).getDestinationFloor());
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.DOWN) {
if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor())) {
printInterup(internalRequests);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) {
printExertup(externalRequests);
elevator.setDirection(Direction.DOWN);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
internalRequests.remove(0);
elevator.setDirection(Direction.DOWN);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor())) {
printExterdown(externalRequests);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor()))) {
printExterdown(externalRequests);
internalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) {
printInterdown(internalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor()) {
elevator.setDirection(Direction.DOWN);
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getSourceFloor()) {
handleStop3(internalRequests.remove(0).getDestinationFloor());
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
elevator.setDirection(Direction.DOWN);
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) {
printExertup(externalRequests);
elevator.setDirection(Direction.DOWN);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
if (internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor()) {
printInterup(internalRequests);
} else if (internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor()) {
printInterdown(internalRequests);
} else if (internalRequests.get(0).getDestinationFloor().equals(elevator.getCurrentFloor())) {
handleStop3(internalRequests.remove(0).getDestinationFloor());
}
}
}
private void handleDownDirection(LinkedList<Passenger> externalRequests, LinkedList<Passenger> internalRequests) {
if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.UP) {
if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor()) {
printExterdown(externalRequests);
elevator.setDirection(Direction.UP);
} else if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor())) {
printInterdown(internalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) {
printInterup(internalRequests);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor()) || (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
internalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExterdown(externalRequests);
internalRequests.remove(0);
elevator.setDirection(Direction.UP);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getSourceFloor()) {
handleStop3(internalRequests.remove(0).getDestinationFloor());
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor()) {
printExterdown(externalRequests);
elevator.setDirection(Direction.UP);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
}
} else if (!externalRequests.isEmpty() && externalRequests.get(0).getDestinationDirection() == Direction.DOWN) {
if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) || (internalRequests.isEmpty() && elevator.getCurrentFloor() > externalRequests.get(0).getSourceFloor())) {
printExterdown(externalRequests);
} else if ((!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor())) {
printInterdown(internalRequests);
} else if ((!internalRequests.isEmpty() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor() && internalRequests.get(0).getDestinationFloor() < externalRequests.get(0).getSourceFloor()) || (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor() > externalRequests.get(0).getSourceFloor())) {
printInterup(internalRequests);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor() && internalRequests.get(0).getDestinationFloor().equals(externalRequests.get(0).getSourceFloor())) {
printExertup(externalRequests);
internalRequests.remove(0);
elevator.setDirection(Direction.DOWN);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() < internalRequests.get(0).getDestinationFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor() && elevator.getCurrentFloor() > internalRequests.get(0).getDestinationFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() != externalRequests.get(0).getSourceFloor()) {
elevator.setDirection(Direction.UP);
handleStop3(internalRequests.remove(0).getDestinationFloor());
} else if (!internalRequests.isEmpty() && internalRequests.get(0).getDestinationFloor() == elevator.getCurrentFloor() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
internalRequests.remove(0);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() < externalRequests.get(0).getSourceFloor()) {
printExertup(externalRequests);
elevator.setDirection(Direction.DOWN);
} else if (internalRequests.isEmpty() && elevator.getCurrentFloor() == externalRequests.get(0).getSourceFloor()) {
handleStop3(externalRequests.get(0).getSourceFloor());
externalRequests.remove(0);
}
} else if (externalRequests.isEmpty()) {
if (internalRequests.get(0).getDestinationFloor() > elevator.getCurrentFloor()) {
printInterup(internalRequests);
} else if (internalRequests.get(0).getDestinationFloor() < elevator.getCurrentFloor()) {
printInterdown(internalRequests);
} else if (internalRequests.get(0).getDestinationFloor().equals(elevator.getCurrentFloor())) {
handleStop3(internalRequests.remove(0).getDestinationFloor());
}
}
}
private void handleStope1(int floor) {
System.out.println("Current Floor: " + floor + " Direction: " + elevator.getDirection());
}
private void handleStop2(int floor) {
System.out.println("Current Floor: " + floor + " Direction: " + elevator.getDirection());
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void handleStop3(int floor) {
System.out.println("Open Door # Floor " + floor);
System.out.println("Close Door");
}
private void elevatorUp(int floor) {
while (elevator.getCurrentFloor() < floor) {
handleStope1(elevator.getCurrentFloor());
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
}
}
private void elevatorDown(int floor) {
while (elevator.getCurrentFloor() > floor) {
handleStope1(elevator.getCurrentFloor());
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
}
}
private void a(LinkedList<Passenger> internalRequests) {
elevatorUp(internalRequests.get(0).getDestinationFloor());
handleStop2(internalRequests.remove(0).getDestinationFloor());
}
private void b(LinkedList<Passenger> externalRequests) {
elevatorUp(externalRequests.get(0).getSourceFloor());
handleStop2(externalRequests.get(0).getSourceFloor());
queue.addInternalRequest(new Passenger(externalRequests.get(0).getDestinationFloor()));
externalRequests.remove(0);
}
private void printInterup(LinkedList<Passenger> internalRequests) {
elevator.setDirection(Direction.UP);
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
elevatorUp(internalRequests.get(0).getDestinationFloor());
handleStop2(internalRequests.remove(0).getDestinationFloor());
}
private void printInterdown(LinkedList<Passenger> internalRequests) {
elevator.setDirection(Direction.DOWN);
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
elevatorDown(internalRequests.get(0).getDestinationFloor());
handleStop2(internalRequests.remove(0).getDestinationFloor());
}
private void printExertup(LinkedList<Passenger> externalRequests) {
elevator.setDirection(Direction.UP);
elevator.setCurrentFloor(elevator.getCurrentFloor() + 1);
elevatorUp(externalRequests.get(0).getSourceFloor());
handleStop2(externalRequests.get(0).getSourceFloor());
queue.addInternalRequest(new Passenger(externalRequests.get(0).getDestinationFloor()));
externalRequests.remove(0);
}
private void printExterdown(LinkedList<Passenger> externalRequests) {
elevator.setDirection(Direction.DOWN);
elevator.setCurrentFloor(elevator.getCurrentFloor() - 1);
elevatorDown(externalRequests.get(0).getSourceFloor());
handleStop2(externalRequests.get(0).getSourceFloor());
queue.addInternalRequest(new Passenger(externalRequests.get(0).getDestinationFloor()));
externalRequests.remove(0);
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int minFloor = input.nextInt();
int maxFloor = input.nextInt();
Elevator elevator = Elevator.getElevatorInstance(minFloor, maxFloor);
RequestQueue requestQueue = RequestQueue.getQueueInstance();
String line;
while (input.hasNextLine()) {
line = input.nextLine().trim();
if (line.equalsIgnoreCase("end")) {
break;
}
if (line.isEmpty()) {
continue;
}
if (line.contains(",")) {
String[] parts = line.replaceAll("[<>]", "").split(",");
int sourceFloor = Integer.parseInt(parts[0].trim());
int destinationFloor = Integer.parseInt(parts[1].trim());
if (elevator.isValidFloor(sourceFloor) && elevator.isValidFloor(destinationFloor)) {
requestQueue.addExternalRequest(new Passenger(sourceFloor, destinationFloor));
}
} else {
int destinationFloor = Integer.parseInt(line.replaceAll("[<>]", ""));
if (elevator.isValidFloor(destinationFloor)) {
requestQueue.addInternalRequest(new Passenger(destinationFloor));
}
}
}
Controller controller = new Controller(elevator, requestQueue);
controller.processRequests();
input.close();
}
}
解题思路(核心算法):
第一步,按电梯的状态分为三种情况:【1】电梯初始时在一楼,方向向上 【2】电梯方向向上【3】电梯方向向下;
第二步,再在第一步三种情况的每种情况里,分出三种情况:【1】外部请求外部请求方向向上【2】外部请求方向向下【3】外部请求为空;
第三步,在第二部的三种情况的每种情况里,思考出电梯、外部请求、内部请求的楼层数的所有情况下电梯会执行什么行为,再把电梯执行相同行为的情况进行合并。
代码的类图如下:

类的总体设计思路:
Passenger类:封装乘客请求信息,包含出发楼层(sourceFloor)与目标楼层(destinationFloor),通过方法获取 / 设置属性及目标方向(getDestinationDirection),清晰表示乘客需求。
Elevator类:管理电梯状态,如当前楼层(currentFloor)、运行方向(direction,依赖Direction枚举)、最大与最小楼层(maxFloor/minFloor)。通过方法修改 / 获取状态,并校验楼层有效性(isValidFloor).
Direction枚举:定义电梯运行方向(UP、DOWN、IDLE),为系统提供统一的方向标识,增强代码可读性与可维护性。
RequestQueue类:包含乘客请求队列,区分内部(internalRequests)与外部(externalRequests)请求,通过方法添加请求(addInternalRequest/addExternalRequest),集中管理请求数据。
Controller类:作为系统控制核心,关联Elevator与RequestQueue,通过一系列handle方法(如handleUpDirection)处理电梯运行逻辑,协调电梯状态与请求队列,实现电梯调度策略。
代码的Source Monitor分析结果如下:

由此可分析出我的代码:
注释情况:% Comments 为 0.0%,表明代码中完全没有注释,严重影响可读性与可维护性。
复杂度:Max Complexity 高达 93,说明方法复杂度极高,导致理解、调试与维护困难。平均复杂度(Avg Complexity)为 5.71,整体复杂度偏高。
其他:% Branches 为 23.5%(分支结构占比),Calls 为 658(方法调用频繁),Max Depth 为 5(深度较大)。
总体分析:
类结构符合SRP单一职责原则
缺乏注释:% Comments = 0.0%,代码逻辑(尤其是复杂条件分支)难以理解。
高复杂度方法:Max Complexity = 93(如handleUpDirection),条件嵌套深(Max Depth = 5),分支占比高(% Branches = 23.5%),逻辑冗长且易出错。
方法命名不清晰:如a()、b()、printInterup()等命名无意义,可读性差。
代码冗余:相似逻辑(如电梯移动、开关门)在不同handle方法中重复实现,可提取公共方法。
状态转移混乱:电梯方向切换(如IDLE转UP/DOWN)的条件判断复杂.
总结
我的代码实现了电梯调度的核心逻辑,但存在严重的可维护性问题:零注释、高复杂度方法、命名不规范是主要痛点。架构上职责划分初步合理,但控制逻辑过于集中在Controller类,条件分支泛滥,导致扩展和调试困难。需优先重构复杂方法,补充注释,并引入设计模式简化状态管理。
三、改进建议
(1):增加代码注释
(2):优化算法结构,或许可以换一种复杂度小于60的算法,通过考虑电梯距离内部请求和外部请求的远近来分出不同的情况,或许能优化代码结构
(3):命名应该规范,采用驼峰命名法,将 a()、b() 改为 handleInternalRequest()、handleExternalRequest() 等描述性名称,统一方法名,如 handleStop1、printInternalUp()、processInitialRequests(),
directions 可改为 externalRequestDirections,明确与外部请求关联。
(4):拆分长方法:将 processRequests() 拆分为 determineNextTarget()、handleStop()、updateDirection() 等小方法。
(5):增加输入校验功能,提高代码的安全性
(6):应该对空指针保护,在访问列表元素前检查是否为空(如 !internalRequests.isEmpty()),避免 IndexOutOfBoundsException。
(7):大量重复的条件判断(如电梯移动、开关门逻辑在多个方法中重复)。handleUpDirection 和 handleDownDirection 逻辑过于复杂,嵌套层级深,应该提取公共方法:
将电梯移动(elevatorUp/elevatorDown)和开关门逻辑(handleStop2/handleStop3)封装为通用方法,避免重复。
(8):提取公共逻辑,使用策略模式简化条件判断,采用面向对象的封装与抽象功能
(9):使用 Javadoc 说明类的职责(如 Controller 负责调度逻辑)、方法参数和返回值。
(10):格式验证正则表达式不够严谨(如 <1, UP> 中的空格处理),应该努力学习正则表达式,String语法
四、总结
我学会了如何正确使用正则表达式、ArrayList和Linkedlist集合、输入错误校验、String语法等知识,真正意识到面向对象的封装性和单一职责原则到底是什么,
这三次电梯类题目也大大提升了我的逻辑思维能力,明白了逻辑思维能力是我自己的短板,也领悟到逻辑思维能力对代码编程的重要性,
南昌航空大学大学的面向对象课程不愧是国家一流课程,对学生的能力要求非常高,非常考验学生的自律性和思维能力,
但也存在一些明显缺点,
第一,课程作业繁重,学生没有足够的课后时间自主学习;
第二,实验作业等作业不应该交给身为大二学生的助教去改,他们自己本来就有繁重的学习任务,必然会对改作业、回答大一学生问题表现出敷衍的态度,我们就遇到了这样很严重的问题,希望老师不要偷懒,自己亲力亲为更好,
同时也能更好地了解学生的学习状态
第三,线上网课质量有待提高,可参考黑马程序员的高质量讲解视频
至此,感谢浏览!

浙公网安备 33010602011771号