时间:2020-11-10 15:31:53 | 栏目:JAVA代码 | 点击:次
一、思路
写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路:
二、实现
2.1 电梯类
package Ele; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Random; public class Elevator { private List<Integer> upFloorList = new ArrayList<Integer>(); // 上升楼层 private List<Integer> downFloorList = new ArrayList<Integer>(); // 下降楼层 private int[] storeyWeight; // 目标层重量 private int capacity; // 电梯最大重量 private int topFloor; // 电梯最高层 private int bottomFloor; // 电梯最底层 private int nowFloor = 1; // 当前层 public Elevator(int bottomFloor, int topFloor, int capacity) { //有参构造方法 this.topFloor = topFloor; this.bottomFloor = bottomFloor; this.capacity = capacity; // 当前楼层减最低层,就是当前层重量的下标 假如当前楼层为5楼,5楼下标就是 5-1 = 4 // 初始化目标楼层重量,数组大小 = 最高层 - 最低层 + 1 storeyWeight = new int[(topFloor - bottomFloor + 1)]; } // 设置楼层 public void SetFloor(int floorNum) { //如果 所选楼层 与 所在楼层 相同,则提示 if (floorNum == nowFloor) { System.out.println("请选择其它楼层"); return; } // 生成90-500之间的随机重量 Random random = new Random(); int thisFloorWeight = random.nextInt(500 - 90 + 1) + 90; int sum = 0; //目标楼层增加的重量 for (int i = 0; i < storeyWeight.length; i++) { sum += storeyWeight[i]; } //原重量+增加重量=当前重量 System.out.println(floorNum + "层上来重量:" + thisFloorWeight + ",此时总重:" + (sum + thisFloorWeight)); // 如果 目标楼层总重量 > 最大重量,提示 if (sum + thisFloorWeight > this.capacity) { System.out.println("超重了哟"); return; } // 当前输入楼层重量加上该楼层新增加重量 后的重量 storeyWeight[floorNum - bottomFloor] += thisFloorWeight; //如果输入楼层数 已经在上升或下降楼层的集合中,则只新增重量,不添加楼层 if (!upFloorList.contains(floorNum) && !downFloorList.contains(floorNum)) { if (floorNum > nowFloor) { upFloorList.add(floorNum); // 上升楼层升序排序 Collections.sort(upFloorList); } else { downFloorList.add(floorNum); // 下降楼层降序排序 downFloorList.sort(Collections.reverseOrder()); } } } // 上升:从所在层到所选楼层中的最高层 // 下降:从所在层到所选楼层中的最低层 // 获得集合中最后一个元素:list.get(list.size()-1); // 启动电梯 public void StartElevator() throws InterruptedException { System.out.println("当前第 < " + nowFloor + " > 层"); // 上行 if (upFloorList.size() > 0) { System.out.println("---电梯上行---"); for (int i = nowFloor + 1; i <= upFloorList.get(upFloorList.size() - 1); i++) { Thread.sleep(500); System.out.println("---第" + i + "层---"); if (upFloorList.contains(i)) { System.out.println(" ☆开门☆"); nowFloor = i; upFloorList.remove(upFloorList.indexOf(i)); storeyWeight[i - bottomFloor] = 0; if (upFloorList.size() > 0) { System.out.println("剩余所选层数为:"); Iterator it = upFloorList.iterator(); while (it.hasNext()) { int floor = (int) it.next(); System.out.print(floor + "层 重量:" + storeyWeight[floor - bottomFloor] + " "); } System.out.println(); } return; } } } // 下行 if (downFloorList.size() > 0) { System.out.println("---电梯下行---"); for (int i = nowFloor - 1; i >= bottomFloor; i--) { Thread.sleep(500); System.out.println("---第" + i + "层---"); if (downFloorList.contains(i)) { System.out.println(" ☆开门☆"); nowFloor = i; downFloorList.remove(downFloorList.indexOf(i)); storeyWeight[i - bottomFloor] = 0; if (downFloorList.size() > 0) { System.out.println("剩余所选层数为:"); Iterator it = downFloorList.iterator(); while (it.hasNext()) { int floor = (int) it.next(); System.out.print(floor + "层 重量:" + storeyWeight[floor - bottomFloor] + " "); } System.out.println(); } return; } } } System.out.println("无客"); } }
2.2 程序入口
package com.company; import Ele.Elevator; import java.util.Scanner; public class Main { public static void main(String[] args) throws InterruptedException { // 创建一个电梯 int bottomFloor = 1; // 最低层1楼 int topFloor = 12; // 最高层12楼 int capacity = 1000; // 最大承重1000 Elevator elvator = new Elevator(bottomFloor, topFloor, capacity); System.out.println("当前电梯可选择" + bottomFloor + "-" + topFloor + "层,请选择楼层数(输入-1表示关闭电梯门):"); //输入内容 Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { //如果输入不是数字,提示后,再次输入 if (!scanner.hasNextInt()) { System.out.println("请输入数字!"); scanner.next(); } //输入是数字则进行以下操作 else { int num = scanner.nextInt(); //若输入数字为-1,意为结束输入,启动电梯 if (num == -1) { System.out.println("------------------------"); System.out.println("电梯门关闭,开始启动"); elvator.StartElevator(); } else if (num > topFloor || num < bottomFloor || num == 0) { //若输入数字不符合楼层数,则提示并再次输入 System.out.println("请选择1-12楼层。"); } else { elvator.SetFloor(num); } } } } }
三、总结
这个简易电梯程序,基本实现了电梯的上行和下行判断,当选择多个楼层时,可以对同为上行或下行的目标楼层自动排序依次到达,每个目标楼层会随机生成乘客重量并记录。
在写这个程序时,遇见了一些问题:
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层停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正