基于Java的电梯系统
一、思路
写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路:
- 电梯有最高层和最低层,输入数字选择正确楼层数
- 输入数字大于当前楼层,则为上行;小于当前楼层,则为下行
- 每次输入数字的时候,需要对同为上行的数字或者同为下行的数字,进行排序
- 所输入的目标楼层用集合存放,循环最低层到最高层,如果当前层在集合中存在,显示开门,若还有目标楼层,则关门,继续到下一目标楼层。
- 当选择一个目标楼层,会生成随机重量记录在目标楼层,上行用原来重量加上目标楼层重量,下行则用原来重量减去目标楼层重量
二、实现
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楼停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正
本文作者:百亩
版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。