基于Java的电梯系统实现过程

 更新时间:2019年10月24日 10:27:31   作者:百亩  
这篇文章主要介绍了基于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层停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java中list的用法和实例讲解

    java中list的用法和实例讲解

    这篇文章主要介绍了java中list的用法和实例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 聊聊finally中的代码一定会执行吗

    聊聊finally中的代码一定会执行吗

    通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,本文想和大家聊聊finally中的代码一定会执行吗?,感兴趣的朋友跟着小编一起来看看吧
    2023-12-12
  • JDK 7U15在 Windows x86平台下的安装方法

    JDK 7U15在 Windows x86平台下的安装方法

    本文给大家分享的是如何在windows平台下安装JDK最新版的方法,十分的简单全面,有需要的小伙伴可以参考下
    2016-05-05
  • Java 函数式编程要点总结

    Java 函数式编程要点总结

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。Java8新引入函数式编程方式,大大的提高了编码效率。本文将对涉及的对象等进行统一的学习及记录。
    2021-06-06
  • Java使用Thread创建多线程并启动操作示例

    Java使用Thread创建多线程并启动操作示例

    这篇文章主要介绍了Java使用Thread创建多线程并启动操作,结合实例形式分析了Java基于Thread类的多线程定义与启动简单操作技巧,需要的朋友可以参考下
    2018-06-06
  • Java中ConcurrentHashMap是如何实现线程安全

    Java中ConcurrentHashMap是如何实现线程安全

    ConcurrentHashMap是一个哈希表,支持检索的全并发和更新的高预期并发。本文主要介绍了Java中ConcurrentHashMap是如何实现线程安全,感兴趣的可以了解一下
    2021-11-11
  • java实现计算器功能

    java实现计算器功能

    这篇文章主要为大家详细介绍了java实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • SpringMVC图片文件跨服务器上传

    SpringMVC图片文件跨服务器上传

    这篇文章主要为大家详细介绍了SpringMVC图片文件跨服务器上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Hadoop中的压缩与解压缩案例详解

    Hadoop中的压缩与解压缩案例详解

    压缩就是通过某种技术(算法)把原始文件变下,相应的解压就是把压缩后的文件变成原始文件,本文给大家分享Hadoop中的压缩知识,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 浅谈如何优雅地停止Spring Boot应用

    浅谈如何优雅地停止Spring Boot应用

    这篇文章主要介绍了浅谈如何优雅地停止Spring Boot应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论