基于Java的电梯系统

一、思路

写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路:

  1. 电梯有最高层和最低层,输入数字选择正确楼层数
  2. 输入数字大于当前楼层,则为上行;小于当前楼层,则为下行
  3. 每次输入数字的时候,需要对同为上行的数字或者同为下行的数字,进行排序
  4. 所输入的目标楼层用集合存放,循环最低层到最高层,如果当前层在集合中存在,显示开门,若还有目标楼层,则关门,继续到下一目标楼层。
  5. 当选择一个目标楼层,会生成随机重量记录在目标楼层,上行用原来重量加上目标楼层重量,下行则用原来重量减去目标楼层重量

二、实现

   2.1 电梯类

 

  1 package Ele;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Collections;
  5 import java.util.Iterator;
  6 import java.util.List;
  7 import java.util.Random;
  8 
  9 public class Elevator {
 10     private List<Integer> upFloorList = new ArrayList<Integer>();       // 上升楼层
 11     private List<Integer> downFloorList = new ArrayList<Integer>();     // 下降楼层
 12     private int[] storeyWeight; // 目标层重量
 13     private int capacity;       // 电梯最大重量
 14     private int topFloor;       // 电梯最高层
 15     private int bottomFloor;    // 电梯最底层
 16     private int nowFloor = 1;   // 当前层
 17 
 18     public Elevator(int bottomFloor, int topFloor, int capacity) { //有参构造方法
 19         this.topFloor = topFloor;
 20         this.bottomFloor = bottomFloor;
 21         this.capacity = capacity;
 22 
 23         // 当前楼层减最低层,就是当前层重量的下标 假如当前楼层为5楼,5楼下标就是 5-1 = 4
 24         // 初始化目标楼层重量,数组大小 = 最高层 - 最低层 + 1
 25         storeyWeight = new int[(topFloor - bottomFloor + 1)];
 26     }
 27 
 28     // 设置楼层
 29     public void SetFloor(int floorNum) {
 30         //如果 所选楼层 与 所在楼层 相同,则提示
 31         if (floorNum == nowFloor) {
 32             System.out.println("请选择其它楼层");
 33             return;
 34         }
 35 
 36         // 生成90-500之间的随机重量
 37         Random random = new Random();
 38         int thisFloorWeight = random.nextInt(500 - 90 + 1) + 90;
 39 
 40         int sum = 0;
 41         //目标楼层增加的重量
 42         for (int i = 0; i < storeyWeight.length; i++) {
 43             sum += storeyWeight[i];
 44         }
 45         //原重量+增加重量=当前重量
 46         System.out.println("选择" + floorNum + "楼乘客重量:" + thisFloorWeight + ",此时总重:" + (sum + thisFloorWeight));
 47 
 48         // 如果 目标楼层总重量 > 最大重量,提示
 49         if (sum + thisFloorWeight > this.capacity) {
 50             System.out.println("超重了哟");
 51             return;
 52         }
 53 
 54         // 当前输入楼层重量加上该楼层新增加重量 后的重量
 55         storeyWeight[floorNum - bottomFloor] += thisFloorWeight;
 56 
 57         //如果输入楼层数 已经在上升或下降楼层的集合中,则只新增重量,不添加楼层
 58         if (!upFloorList.contains(floorNum) && !downFloorList.contains(floorNum)) {
 59             if (floorNum > nowFloor) {
 60                 upFloorList.add(floorNum);
 61 
 62                 // 上升楼层升序排序
 63                 Collections.sort(upFloorList);
 64 
 65             } else {
 66                 downFloorList.add(floorNum);
 67 
 68                 // 下降楼层降序排序
 69                 downFloorList.sort(Collections.reverseOrder());
 70             }
 71         }
 72     }
 73 
 74     // 上升:从所在层到所选楼层中的最高层
 75     // 下降:从所在层到所选楼层中的最低层
 76     // 获得集合中最后一个元素:list.get(list.size()-1);
 77 
 78     // 启动电梯
 79     public void StartElevator() throws InterruptedException {
 80         System.out.println("当前为 < " + nowFloor + " > 楼");
 81         // 上行
 82         if (upFloorList.size() > 0) {
 83             System.out.println("---电梯上行---");
 84             for (int i = nowFloor + 1; i <= upFloorList.get(upFloorList.size() - 1); i++) {
 85                 Thread.sleep(500);
 86                 System.out.println("----" + i + "楼---");
 87                 if (upFloorList.contains(i)) {
 88                     System.out.println("---☆开门☆---");
 89                     nowFloor = i;
 90                     upFloorList.remove(upFloorList.indexOf(i));
 91                     storeyWeight[i - bottomFloor] = 0;
 92 
 93                     if (upFloorList.size() > 0) {
 94                         System.out.print("剩余所选楼层为:");
 95                         Iterator it = upFloorList.iterator();
 96                         while (it.hasNext()) {
 97                             int floor = (int) it.next();
 98                             System.out.print(floor + "楼  重量为 " + storeyWeight[floor - bottomFloor] + ";  ");
 99                         }
100                         System.out.println();
101                     }
102                     return;
103                 }
104             }
105         }
106 
107         // 下行
108         if (downFloorList.size() > 0) {
109             System.out.println("---电梯下行---");
110             for (int i = nowFloor - 1; i >= bottomFloor; i--) {
111                 Thread.sleep(500);
112                 System.out.println("----" + i + "楼---");
113                 if (downFloorList.contains(i)) {
114                     System.out.println("---☆开门☆---");
115                     nowFloor = i;
116                     downFloorList.remove(downFloorList.indexOf(i));
117                     storeyWeight[i - bottomFloor] = 0;
118                     if (downFloorList.size() > 0) {
119                         System.out.print("剩余所选楼层为:");
120                         Iterator it = downFloorList.iterator();
121                         while (it.hasNext()) {
122                             int floor = (int) it.next();
123                             System.out.print(floor + "楼  重量为 " + storeyWeight[floor - bottomFloor] + ";  ");
124                         }
125                         System.out.println();
126                     }
127                     return;
128                 }
129             }
130         }
131         System.out.println("无客");
132 
133     }
134 }

 

   2.2 程序入口

 

 1 package com.company;
 2 
 3 
 4 import Ele.Elevator;
 5 
 6 import java.util.Scanner;
 7 
 8 public class Main {
 9 
10     public static void main(String[] args) throws InterruptedException {
11         // 创建一个电梯
12         int bottomFloor = 1;    // 最低层1楼
13         int topFloor = 12;      // 最高层12楼
14         int capacity = 1000;    // 最大承重1000
15         Elevator elvator = new Elevator(bottomFloor, topFloor, capacity);
16 
17         System.out.println("当前电梯可选择" + bottomFloor + "-" + topFloor + "层,请选择楼层数(输入-1表示关闭电梯门):");
18 
19         //输入内容
20         Scanner scanner = new Scanner(System.in);
21         while (scanner.hasNextLine()) {
22             //如果输入不是数字,提示后,再次输入
23             if (!scanner.hasNextInt()) {
24                 System.out.println("请输入数字!");
25                 scanner.next();
26             }
27 
28             //输入是数字则进行以下操作
29             else {
30                 int num = scanner.nextInt();
31                 //若输入数字为-1,意为结束输入,启动电梯
32                 if (num == -1) {
33                     System.out.println("------------------------");
34                     System.out.println("电梯门关闭,开始启动");
35                     elvator.StartElevator();
36                 } else if (num > topFloor || num < bottomFloor || num == 0) {
37                     //若输入数字不符合楼层数,则提示并再次输入
38                     System.out.println("请选择" + bottomFloor + "-" + topFloor + "层");
39                 } else {
40                     elvator.SetFloor(num);
41                 }
42             }
43         }
44     }
45 }

三、展示

 1. 乘客选择楼层,输入-1表示结束选择。(乘客重量为随机产生)

   

 2. 电梯从高到低或从低到高顺序 依次到达,每到达一目标层,都需输入-1关门,电梯继续运行 至下一目标楼层

    

    

      

 3. 当无选择楼层 ,直接输入-1 关门时,显示当前楼层,提示无客

    

 4. 当选择楼层与当前所在楼层一样时,提示

   

 5. 当选择楼层不符合电梯最高最低楼层设置时,提示

   

四、总结

  这个简易电梯程序,基本实现了电梯的上行和下行判断,当选择多个楼层时,可以对同为上行或下行的目标楼层自动排序依次到达,每个目标楼层会随机生成乘客重量并记录。

在写这个程序时,遇见了一些问题:

1.  使用while语句接收用户输入时,判断输入是否为数字,输入不是数字会陷入死循环提示。在此增加了scanner.next()语句,提示后可以继续输入。

  if (!scanner.hasNextInt()) {
                System.out.println("请输入数字!");
                scanner.next();
            }

 

2.  若重复选择某楼层,到达该楼层后,仍会显示该楼层为剩余楼层。在此增加了判断语句,如果选择的楼层数已经存在于上升或下降目标楼层的集合中,则只增加重量,不会重复添加目标楼层。

 if (!upFloorList.contains(floorNum) && !downFloorList.contains(floorNum)) {
            if (floorNum > nowFloor) {
                upFloorList.add(floorNum);

                // 上升楼层升序排序
                Collections.sort(upFloorList);

            } else {
                downFloorList.add(floorNum);

                // 下降楼层降序排序
                downFloorList.sort(Collections.reverseOrder());
            }
        }
    }

 

3.  将目标楼层随机产生的重量存放于一个数组中,当前楼层减最低层,就是当前层重量的下标,假如当前楼层为5楼,5楼下标就是 5-1 = 4,storeyWeight[4]即为5楼重量。

 

  代码还有不完善的地方,例如若从1到8楼上升时,6楼有人也要乘坐电梯,如何满足在6楼停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正

posted @ 2019-10-23 22:49  百亩  阅读(1384)  评论(1编辑  收藏  举报