介绍:
用Java编写对的模拟电梯上下楼。
运行截图:
-
初始化界面
-
电梯进行上楼,输入3 5 -1
-
电梯下楼,输入2 4 -1
-
出现有电梯上下楼时,根据上一次电梯运行的方向继续运行。输入1 3 -1
源代码,仅供参考。
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仍可以结束