基于Java的電梯系統(tǒng)實現(xiàn)過程
一、思路
寫一個簡單的電梯系統(tǒng),首先根據(jù)老師提供的需求,寫一下基礎思路:
- 電梯有最高層和最低層,輸入數(shù)字選擇正確樓層數(shù)
- 輸入數(shù)字大于當前樓層,則為上行;小于當前樓層,則為下行
- 每次輸入數(shù)字的時候,需要對同為上行的數(shù)字或者同為下行的數(shù)字,進行排序
- 所輸入的目標樓層用集合存放,循環(huán)最低層到最高層,如果當前層在集合中存在,顯示開門,若還有目標樓層,則關門,繼續(xù)到下一目標樓層。
- 當選擇一個目標樓層,會生成隨機重量記錄在目標樓層,上行用原來重量加上目標樓層重量,下行則用原來重量減去目標樓層重量
二、實現(xiàn)
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) { //有參構(gòu)造方法
this.topFloor = topFloor;
this.bottomFloor = bottomFloor;
this.capacity = capacity;
// 當前樓層減最低層,就是當前層重量的下標 假如當前樓層為5樓,5樓下標就是 5-1 = 4
// 初始化目標樓層重量,數(shù)組大小 = 最高層 - 最低層 + 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;
//如果輸入樓層數(shù) 已經(jīng)在上升或下降樓層的集合中,則只新增重量,不添加樓層
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("剩余所選層數(shù)為:");
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("剩余所選層數(shù)為:");
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 {
// 創(chuàng)建一個電梯
int bottomFloor = 1; // 最低層1樓
int topFloor = 12; // 最高層12樓
int capacity = 1000; // 最大承重1000
Elevator elvator = new Elevator(bottomFloor, topFloor, capacity);
System.out.println("當前電梯可選擇" + bottomFloor + "-" + topFloor + "層,請選擇樓層數(shù)(輸入-1表示關閉電梯門):");
//輸入內(nèi)容
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
//如果輸入不是數(shù)字,提示后,再次輸入
if (!scanner.hasNextInt()) {
System.out.println("請輸入數(shù)字!");
scanner.next();
}
//輸入是數(shù)字則進行以下操作
else {
int num = scanner.nextInt();
//若輸入數(shù)字為-1,意為結(jié)束輸入,啟動電梯
if (num == -1) {
System.out.println("------------------------");
System.out.println("電梯門關閉,開始啟動");
elvator.StartElevator();
} else if (num > topFloor || num < bottomFloor || num == 0) {
//若輸入數(shù)字不符合樓層數(shù),則提示并再次輸入
System.out.println("請選擇1-12樓層。");
} else {
elvator.SetFloor(num);
}
}
}
}
}
三、總結(jié)
這個簡易電梯程序,基本實現(xiàn)了電梯的上行和下行判斷,當選擇多個樓層時,可以對同為上行或下行的目標樓層自動排序依次到達,每個目標樓層會隨機生成乘客重量并記錄。
在寫這個程序時,遇見了一些問題:
1. 使用while語句接收用戶輸入時,判斷輸入是否為數(shù)字,輸入不是數(shù)字會陷入死循環(huán)提示。在此增加了scanner.next()語句,提示后可以繼續(xù)輸入。
if (!scanner.hasNextInt()) {
System.out.println("請輸入數(shù)字!");
scanner.next();
}
2. 若重復選擇某樓層,到達該樓層后,仍會顯示該樓層為剩余樓層。在此增加了判斷語句,如果選擇的樓層數(shù)已經(jīng)存在于上升或下降目標樓層的集合中,則只增加重量,不會重復添加目標樓層。
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. 將目標樓層隨機產(chǎn)生的重量存放于一個數(shù)組中,當前樓層減最低層,就是當前層重量的下標,假如當前樓層為5樓,5樓下標就是 5-1 = 4,storeyWeight[4]即為5樓重量。
代碼還有不完善的地方,例如若從1到8層上升時,6層有人也要乘坐電梯,如何滿足在6層停止并上人后,繼續(xù)上行。這些還有待我繼續(xù)完善,也望請大家批評指正
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解SpringBoot Controller接收參數(shù)的幾種常用方式
這篇文章主要介紹了詳解SpringBoot Controller接收參數(shù)的幾種常用方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
Spring Boot配置特定屬性spring.profiles的方法
這篇文章主要介紹了Spring Boot配置特定屬性spring.profiles的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11
基于javaweb+jsp的游泳館會員管理系統(tǒng)(附源碼)
這篇文章主要介紹了基于javaweb+jsp的游泳館會員管理系統(tǒng),開發(fā)工具eclipse/idea/myeclipse/sts等均可配置運行,此源代碼社和課程設計,大作業(yè)及畢業(yè)設計項目,需要的朋友可以參考下2022-04-04
淺談@RequestParam(required = true)的誤區(qū)
這篇文章主要介紹了@RequestParam(required = true)的誤區(qū),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring?Cloud?通過?Gateway?webflux實現(xiàn)網(wǎng)關異常處理
在某一個服務中出現(xiàn)異常,通過@ControllerAdvice?+?@ExceptionHandler?統(tǒng)一異常處理,即使在微服務架構(gòu)中,也可以將上述統(tǒng)一異常處理放入到公共的微服務中,這樣哪一個微服務需要,直接引入模塊,本文重點介紹Spring?Cloud?通過?Gateway?webflux實現(xiàn)網(wǎng)關異常處理,一起看看吧2023-11-11
Spring Security SecurityContextHolder組件示例說明
SpringSecurity的SecurityContextHolder組件是存儲當前安全上下文的地方,包括認證用戶信息,它支持全局訪問、線程局部存儲和上下文傳播,是SpringSecurity認證和授權的核心,文章通過示例展示了如何訪問已認證用戶的詳細信息、手動設置認證信息以及使用認證信息保護方法2024-11-11

