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仍可以结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

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