Java模拟电梯系统

介绍:

用Java编写对的模拟电梯上下楼。

运行截图:

  • 初始化界面
1.png
  • 电梯进行上楼,输入3 5 -1
2.PNG
  • 电梯下楼,输入2 4 -1
3.PNG
  • 出现有电梯上下楼时,根据上一次电梯运行的方向继续运行。输入1 3 -1
4.PNG
源代码,仅供参考。
package cn.szw;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;

public class elevator {
    final static int CAPACITY=1000;
    final static int TOP_FLOOR = 12;  //电梯最高层
    final static int BOTTOM_FLOOR = 1; //电梯最底层

    public  static void main(String args[]) throws InterruptedException{
        System.out.println("该电梯总楼数是12层,第一层编号为第1层。");
        //默认当前楼层为第一层,z代表当前楼层
        int z = 1;
        //before代表上一次电梯是向上还是向下。1向上,0向下。
        int before = 1;
        while(true){
            //获得输入的层数保存在list中
            ArrayList<Integer> list =  arrive_List(z);
            ArrayList<Integer> list_up = new ArrayList<Integer>();
            ArrayList<Integer> list_down = new ArrayList<Integer>();
            if((list.size() == 1 && list.get(0) == -1) || list.size()==0) {
                System.err.println("电梯不运行,在第"+z+"层。");
            }else {
                //进行排序
                Collections.sort(list);
                if(list.get(0)!=-1){
                    System.err.println("请按规则重新输入楼层,注意结束后输入-1!");
                    continue;
                }else{
                    list.remove(0);
                }
                System.out.println("正在检查是否超重。。。");
                Thread.sleep(800);
                //对体重的大小进行判断
                Random_body_weight();           
                //将上下楼进行分成两个list
                for(int i=0;i<list.size();i++) {
                    if(list.get(i)>z) {
                        list_up.add(list.get(i));
                    }else {
                        list_down.add(list.get(i));
                    }
                }
                //对上楼还是下楼进行判断
            }
            if(before == 1) {
                z = up_up(z, list_up);
                z = down_down(z,list_down);
                before = change_before(list_down,list_up);      
            }else{
                z = down_down(z,list_down);
                z = up_up(z, list_up);
                before = change_before(list_down,list_up);
            }
        }
    }

    private static int change_before(ArrayList<Integer> list_down, ArrayList<Integer> list_up) {
        //返回更新before的值
        if(list_down.size()==0) {
            return 1;
        }else if (list_up.size()==0){
            return 0;
        }else {
            return 0;
        }
    }

    private static int down_down(int z, ArrayList<Integer> list_down) throws InterruptedException {
        //遍历循环下楼的层数
        for(int q = list_down.size()-1; q >= 0; q--) {
            Function_b(list_down.get(q),z);
            z = list_down.get(q);
        }
        return z;
    }

    private static int up_up(int z,ArrayList<Integer> list_up) throws InterruptedException {
        //遍历循环上楼的层数
        for(int q = 0; q < list_up.size(); q++) {
            Function_a(list_up.get(q),z);
            z = list_up.get(q);
        }
        return z;
    }

    //对输入的楼层进行存储
    public static ArrayList<Integer> arrive_List(int z) throws InterruptedException{
        System.out.println("请输入您需要去的楼层,结束后输入-1。");
        ArrayList<Integer> list = new ArrayList<Integer>();
        Scanner in = new Scanner(System.in);
        //读入一行数据
        String str=in.nextLine();
        //split函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回
        String[] str1=str.split("\\s+");
        for(String a : str1){
            //将字符串数组的元素转换为整型
            int number = Integer.parseInt(a);
            //二个条件语句去除非法数字
            if(number==z) {
                System.out.println("您就在第"+z+"楼层!");
                continue;
            }else if(number==-1){
                list.add(number);
                break;
            }else if(number>TOP_FLOOR || number< -1 || number == 0) {
                Thread.sleep(800);
                System.out.println("您输入第"+number+"楼,不合法,已去除。");
                continue;
            }else {
                list.add(number);
            }   
        }
        //进行去除重复数字操作
        HashSet<Integer> set = new HashSet<Integer>(list);
        if(set.size() == list.size()){
            return list;
        }else{
            ArrayList<Integer> list_no_repeat = new ArrayList<Integer>(set);
            System.err.println("您输入的数字中含有重复数字!");
            System.out.println(list_no_repeat);
            return list_no_repeat;
        }
    }
    //打印上楼
    public static void Function_a(int b,int z) throws InterruptedException {
        for(int now = z;now <= b;now++) {
            Thread.sleep(1000);
            System.out.println("...第"+now+"层...");
        }
        Thread.sleep(1000);
        System.out.println("到达第"+b+"层,开门!"); 
        Thread.sleep(1000);
        Random_body_weight();
    }
    
    //打印下楼
    public static void Function_b(int b,int z) throws InterruptedException {
        for(int now = z;now >= b;now--) {
            Thread.sleep(1000);
            System.out.println("...第"+now+"层...");
        }
        Thread.sleep(1000);
        System.out.println("到达第"+b+"层,开门!"); 
        Thread.sleep(1000);
        Random_body_weight();
    }
    
    //电梯体重随机生成
    public static void Random_body_weight(){
        //设置最大最小的随机数
        int max=1300;
        int min=40;
        Random random = new Random();
        //生成随机数s
        int s = random.nextInt(max)%(max-min+1) + min;
        if(s>CAPACITY){
            System.err.println("重量为"+s+"Kg电梯超重,无法关门。。。");
        }else{
            System.out.println("重量为"+s+"Kg未超重,正常运行。。。");
        }
    }
}
部分实现方法思想:
  • 输入、保存数据:首先是对数据的输入,用户在控制台上输入想要去的楼层的数字,最后输入-1结束,使用nextLine()将一行的数据保存在字符串中,然后再利用split方法将字符串通过分割转换成字符数组,注意这里的split方法中填入的输分割字符的字符,我这里使用了正则表达式,代表去除多个或一个空格。存储到字符串数组后,将字符串数组进行遍历,将数据转化成int类型,然后利用三个判断确定是不是非法数字,如果是的话结束循环,不将数据保存到ArrayList中。保存到ArrayList之后,为了确保不能有重复数字,通过Hashset进行查重、去重。返回满意的list。

  • 排序、分组。得到list后将list通过Collections.sort()方法进行排序,为了方便上下楼的语句输出,将list中的数据分成两组,z代表当前楼层,初始化值为1,list中的数据与z当前楼层作比较,如果大的代表需要上的楼层,放入单独的一个list中,比z小的也单独放入一个list集合中。

  • 判断先下楼还是先上楼:全局定义一个before变量,初始化值为1。当before等于1的时候,代表上一次电梯运行的方向是向上,那么当输入的楼层有向上和向下的时候时,先会向上运行再向下运行,运行完这次电梯之后,将会更改before的值,将before改为0,下次再遇见上楼和下楼的问题时,就会先下后上。

  • 对输入重复的数字进行去重:由于ArrayList自身没有去重方法,所以这里运用了HashSet的特性,HashSet的集合中不能有重复数字。创建HashSet,数据仍是list中的数据,之后再判断两个集合的长度是否相等,如果相等代表没有重复元素,如果不相等代表含有重复数据,返回更改后没有重复的数据。

  • 体重随机数:利用random类中的nextInt方法,数值在40-1300之间,生成随机数后进行判断是否超过规定体重,然后返回相应的输出语句。在电梯运行的时候进行调用。

  • 延迟输出第n层。比如上楼,用for循环进行遍历集合中的数据,然后在遍历中调用另外一个方法Function_a(),该方法可以延迟输出第n层,在这个方法中给定两个参数,到达的楼层和目前所在的楼层z,然后用for循环进行输出,Thread.sleep()方法是可以延迟时间。下楼也是类似的方法。

部分bug:
  • 输入数字以外报异常

  • 结束需输入-1,实际上不输入-1仍可以结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,737评论 1 118
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,394评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,189评论 0 4
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 843评论 0 2
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,403评论 0 16

友情链接更多精彩内容