5-7电梯类题目总结

一、前言

对5-7电梯类题目集总结

  1. 为顺利解答电梯类题目集,需全面掌握以下核心知识点:
    集合框架:熟练运用 ArrayList 和 LinkedList 集合;
    字符串处理:精通字符串的各类操作,包括截取、拼接、查找与替换等,掌握字符串解析技巧,准确提取关键信息;
    面向对象编程:深刻理解类与对象的概念,通过封装实现数据的隐藏与保护,合理运用方法重载增强代码的灵活性与可读性,借助私有方法实现类内部的特定功能,提升代码的模块化与安全性;
    枚举类型:学会定义和使用枚举类型;

  2. 对题目的感受:
    题目量并不大,总共就是三题,第一次我得了100分,第二次我只拿了75分,第三次我得了100分
    题目难度较大,题目层层递进,非常考验我的逻辑思维能力,但是做完之后让我收获颇丰,特别是通过测试点后那亮眼的满分令我感到振奋,加深了我对代码的兴趣和热爱
    开始做第一次题目时,我的解题思路完全错误,想着就单纯以例题的情况进行分类,这样肯定考虑翁提不周全,结果显然没有做对,
    然后问了作对题目的同班同学,请教他的算法是怎样的,然后思索再三,开发出了独属于我自己的一套算法:
    第一步,按电梯的状态分为三种情况:【1】电梯初始时在一楼,方向向上 【2】电梯方向向上【3】电梯方向向下
    第二步,再在第一步三种情况的每种情况里,分出三种情况:【1】外部请求外部请求方向向上【2】外部请求方向向下【3】外部请求为空
    第三步,在第二部的三种情况的每种情况里,思考出电梯、外部请求、内部请求的楼层数的所有情况下电梯会执行什么行为,再把电梯执行相同行为的情况进行合并
    这样,便把所有情况都考虑了进去,题目就做出来了
    第二次题目和第三次题目就增加了一些需求,多分出了几个类,让我们的代码向面向对象思维靠拢,核心算法并没有改变,有了第一次题目的经验后,花费一些时间,优化自己的代码结构,便能做出来

二、设计与分析

  1. 第一次电梯类题目的设计与分析
    题目要求:模拟电梯运行方式,编写出一个电梯类程序,底层逻辑为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)&&currentFloor!=internalRequests.get(0)) {
                        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)) {
                        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)&&currentFloor<internalRequests.get(0)) {
                            printInterup();
                            continue;
                        } else if (!getInternalRequests().isEmpty() && currentFloor == externalRequests.get(0)&&currentFloor>internalRequests.get(0)) {
                            currentDirection = Direction.DOWN;
                            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.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类分成多个类,处理不同调度策略,避免硬编码。
迭代开发:先实现核心逻辑(如单向请求),再逐步扩展,最终达到覆盖所有情况的目的,避免一次性堆砌代码。

总结:我应该要明白代码清晰性优于功能速成,需通过抽象、分层设计和模式简化逻辑。我未来应重视类图设计、及时重构、注释命名及单元测试,提升代码健壮性与可维护性。





  1. 第二次电梯类题目的设计和分析
    电梯运行规则与第一次电梯类题目相同,对第一次电梯类进行迭代性设计,使得类设计符合单一职责原则,继续执行,包含但不限于乘客请求类、电梯类、请求队列类及控制类,其中控制类专门负责电梯调度过程,
    同时要处理如下情况:
    乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,
    乘客请求不合理,具体为输入时出现连续的相同请求,例如<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语法等知识,真正意识到面向对象的封装性和单一职责原则到底是什么,
这三次电梯类题目也大大提升了我的逻辑思维能力,明白了逻辑思维能力是我自己的短板,也领悟到逻辑思维能力对代码编程的重要性,
南昌航空大学大学的面向对象课程不愧是国家一流课程,对学生的能力要求非常高,非常考验学生的自律性和思维能力,
但也存在一些明显缺点,
第一,课程作业繁重,学生没有足够的课后时间自主学习;
第二,实验作业等作业不应该交给身为大二学生的助教去改,他们自己本来就有繁重的学习任务,必然会对改作业、回答大一学生问题表现出敷衍的态度,我们就遇到了这样很严重的问题,希望老师不要偷懒,自己亲力亲为更好,
同时也能更好地了解学生的学习状态
第三,线上网课质量有待提高,可参考黑马程序员的高质量讲解视频







至此,感谢浏览!

posted @ 2025-04-19 22:19  潇洒与浪荡  阅读(39)  评论(0)    收藏  举报