基于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层停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正

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

(0)

相关推荐

  • java实现简单的学生信息管理系统代码实例

    java实现简单的学生信息管理系统(无界面) 学生类实体: package com.edu.imau.wcy; public class Stu { private String stuNum;//学号 private String name;//姓名 private String gender;//性别 private int age;//年龄 private int score;//分数 public Stu() { super(); } public String getStuNum()

  • Java按时间梯度实现异步回调接口的方法

    1. 背景 在业务处理完之后,需要调用其他系统的接口,将相应的处理结果通知给对方,若是同步请求,假如调用的系统出现异常或是宕机等事件,会导致自身业务受到影响,事务会一直阻塞,数据库连接不够用等异常现象,可以通过异步回调来防止阻塞,但异步的情况还存在一个问题,若调用一次不成功的话接下来怎么处理?这个地方就需要按时间梯度回调,比如前期按10s间隔回调,回调3次,若不成功按30s回调,回调2次,再不成功按分钟回调,依次类推--相当于给了对方系统恢复的时间,不可能一直处于异常或宕机等异常状态,若是再不成

  • Java多线程之火车售票系统

    Java多线程之火车售票(Thread和Runnable的区别) java中实现多线程的方式有两种 继承Thread类 实现Runnable接口 继承了Thread类的类,使用对象.start()启动线程 实现了Runnable类的类,使用new Thread(new Runnable的实现类()).start()启动 下面有个经典例子,很适合用实现Runnable接口的类去实现. 火车售票问题简单分析: 1.票数是共用的,不能将一张票买多次.  2.同时有多个售票点在出售车票,即有多个线程存在

  • Javacript实现颜色梯度变化和渐变的效果代码

    对于本站的导航栏,想做点什么.所以,选择了用js对导航栏的颜色做了梯度的变化处理. 起初,觉得用opacity属性(透明度)来改变颜色的梯度变化.不过,这样会出现一个问题. 每一个导航标签用的是[li],当鼠标浮动到标签上时,通过onmouseover()立即改变[li]的className,并用setInterval()来使其opacity(透明度)由0变到1.不过,当鼠标离开时,对于[li]标签的颜色恢复的处理貌似麻烦了许多.所以,很快就放弃了这个做法,换种思路. 到百度上一搜,看到了一篇很

  • java实现可视化界面肯德基(KFC)点餐系统代码实例

    一.题目 使用java实现可视化KFC点餐系统. 二.题目分析 根据java中的用户图形界面包中的各个类设计界面.利用JFrame提供最大的容器,然后设计各个面板,各个面板中添加所需要的组件,本程序中需要对按钮组件添加监听者,当按下按钮之后做出相应的相应. 对于程序运行显示的第一个界面由一个继承于JFrame的类run类在构造函数中设计并通过函数setVisible(true)显示在界面上,界面上有一个按钮"点餐饮",当此按钮按下时触发响应函数,进入点餐界面,然后通过点击点餐界面各食物

  • java实现学生信息管理系统

    JAVA简单写学生信息管理系统,实现学生信息的输入.查询.修改.删除操作 package Week; import jdk.internal.util.xml.impl.Input; import java.util.HashSet; import java.util.Scanner; public class StudentMs { Scanner sc = new Scanner(System.in); public int getID() { return ID; } public Str

  • Java吃货联盟订餐系统代码实例

    本文实例为大家分享了Java订餐系统的具体代码,供大家参考,具体内容如下 package cn.practice1200; import java.util.Scanner; public class Eater_Alliance { /** * 吃货联盟订餐系统 * * @author QCD * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner

  • java实现酒店管理系统

    本文实例为大家分享了java实现酒店管理系统的具体代码,供大家参考,具体内容如下 编写环境:MyEclipse2014+sql server2014 系统功能: 1.登录验证 2.房态统计显示 3.预定登记并入库 4.入住登记并入库 5.换房登记并入库 6.客人信息查询 7.退房并入库 运行界面如下: =====登录界面====== =====主界面===== =====为每个房间设置弹出菜单====== =====登记界面====== =====换房界面===== =====退房界面=====

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

    一.思路 写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路: 电梯有最高层和最低层,输入数字选择正确楼层数 输入数字大于当前楼层,则为上行:小于当前楼层,则为下行 每次输入数字的时候,需要对同为上行的数字或者同为下行的数字,进行排序 所输入的目标楼层用集合存放,循环最低层到最高层,如果当前层在集合中存在,显示开门,若还有目标楼层,则关门,继续到下一目标楼层. 当选择一个目标楼层,会生成随机重量记录在目标楼层,上行用原来重量加上目标楼层重量,下行则用原来重量减去目标楼层重量 二.实现

  • 基于java开发之系统托盘的应用

    项目结构: 运行效果: ======================================================================== 下面是代码部分: ======================================================================== /tray/src/com/b510/tray托盘/DesktopCapture.java 复制代码 代码如下: package com.b510.tray托盘; i

  • 基于Java实现抽奖系统

    本次任务要求为某商场开发一套幸运抽奖系统,客户必须首先注册成为该商场会员,会员登录成功后,就可以参加抽奖活动了. 注册 用户选择"注册"菜单,进入注册界面.输入用户名和密码后,系统提示注册成功,并给出会员卡号. 登录 注册成功后,用户选择"登录"菜单,进入登录界面.输入注册时的用户名和密码.登录成功,系统提示欢迎信息.如果用户和密码输入错误,提示用户继续输入,最多有3次机会. 抽奖 登录成功后,用户选择"抽奖"菜单,进入幸运抽奖界面.输入会员卡号

  • 基于java流实现压缩图片过程解析

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定. 在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的. package test; import java.io.*; import java.util.Date; import java.awt.*; import java.aw

  • 基于Java Gradle复制项目模块过程图解

    在项目的根目录下执行: File -> New -> Module 包名一般有三段:域.组织.模块 eg: com.kd.adminserver Artifactid 是第三段. 模块路径 根据需要修改新建模块 admin-server 的 build.gradle 右键 admin-server 模块的 webserver 包,重命名. 利用 replace in path 替换下包名的路径. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • 基于Java实现ssh命令登录主机执行shell命令过程解析

    这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.SSH命令 SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH最初是UNI

  • 基于Java实现中文分词系统的示例代码

    目录 1.问题描述 2.相关工作 3.系统框架和算法设计 3.1系统整体框架 1.问题描述 中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词.分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字.句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多.困难的多. 而对于中文

  • 基于Java创建XML(无中文乱码)过程解析

    这篇文章主要介绍了基于Java创建XML(无中文乱码)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package com.zyb.xml; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import org.dom4j.Document; i

  • 基于Java SSM框架开发图书借阅系统源代码

    一.技术框架与开发环境 开发环境: IDE:IDEA 2020 数据库:MySQL 8.0 JDK 1.8 Maven 3.6.1 Tomcat 9 lombok 1.18.1 技术框架: 核心框架:Spring 5.1.9 持久层框架:Mybatis 3.5.2 视图层框架:SpringMVC 5.1.9 前端框架:Bootstrap 4 jquery-3.6.0 二.项目源码 有用就点赞博客 Github 国内:Giee 项目结构 三.功能介绍 1.登录 2.注册 AJAX异步刷新显示判断账

  • 完整音乐播放系统基于Java Springboot + Vue + MyBatis

    目录 摘要 主要设计 功能设计 主要技术 功能截图 用户端首页 登录注册 歌单信息 歌手信息 我的音乐 评论点赞 管理员端 首页 用户管理 歌手管理 歌单管理 部分代码 数据库设计 用户表 评论表 收藏表 歌手歌曲表 歌手表 项目总结 视频演示: springboot+vue音乐网站 摘要 网络技术以及计算机的发展,网友们对网络的要求也日益长高,平常在网上听话用一大堆下载软件下载下来也要管理,又占空间,比如那流行歌曲,下载了听了又要删很不方便·而网络音乐库的实现改变了这一状况.它本身就是一个数字

随机推荐