目录
模拟电梯系统(java)
/  

模拟电梯系统(java)

【逻辑存在错误。】

一、项目介绍(四号宋体加粗)

​ 这个项目是模拟电梯运行的系统,一共12层,用户可以在每一层点击楼层,使电梯到达该楼层,并开门。电梯运行前会检查体重是否超重,如果超重,会提示。如果用户处于中间楼层,如果有向上的楼层和向下的楼层,系统会先判断第一个按的楼层与当前楼层相比较,如果大于当前楼层就先上后下,否则先下后上。

Ka2Lo6.png

二、项目需求分析(四号宋体加粗)

  1. 创建存储需要到达楼层输入集合ArrayList

  2. 获取集合中的最小值(min)和最大值(max)

  3. 向上走的函数 public void goTop(Integer layer)

  4. 向下走的函数 public void goDown(Integer layer)

  5. 如果电梯向上走,传给向上的函数 max值

  6. 如果电梯向下走,传给向下的函数 min值

  7. 每次到达指定的楼层集合元素去除一个

  8. 当电梯向上或者向下完成之后,判断当前集合是否为空,如果为空结束,不为空,反方向运行电梯。

三、项目规划和设计实施(四号宋体加粗)

3.1****项目设计规划(小四号宋体加粗)

  1. public boolean isDigit(String str) 创建输入验证函数,保证输入的字符都是数字类型和指定范围的数字。

  2. public void OverWeight()判断当前体重是否超重

  3. 向上走的函数 public void goTop(Integer layer)

  4. 向下走的函数 public void goDown(Integer layer)

5.集合的去重

3.2****实施方案

  1. 首先运行项目(运行main方法)
public static void main(String[] args) **throws** Exception {
  
   new Elevator().start();
   
}

Ka2vWD.png

  1. 输入的验证(使用正则表达式对输入的字符进行验证)
	// 正则表达式判断输入是否为数字
	// @Test
	public boolean isDigit(String str) {
		String regex = "^[0-9][0-2]?";
		Pattern p = Pattern.compile(regex);
		// 获取matcher 对象
		Matcher matcher = p.matcher(str);
		return matcher.matches();
	}

KaRVfS.png

KaReSg.png

  1. 向上运行和向下运行

KaRtl4.png

输入:
2 4 11 12
0
---当前楼层: 9---
---当前楼层: 8---
---当前楼层: 7---
---当前楼层: 6---
---当前楼层: 5---
---当前楼层: 4---
---到达4楼, 开门!
当前体重超重,无法关门
---当前楼层: 3---
---当前楼层: 2---
---到达2楼, 开门!
当前体重为: 628公斤
---当前楼层: 2---
---当前楼层: 3---
---当前楼层: 4---
---当前楼层: 5---
---当前楼层: 6---
---当前楼层: 7---
---当前楼层: 8---
---当前楼层: 9---
---当前楼层: 10---
---当前楼层: 11---
---到达11楼, 开门!
当前体重超重,无法关门
---当前楼层: 12---
---到达12楼, 开门!
当前体重为: 152公斤

四、项目总结(四号宋体加粗)

本次项目课程让我对集合的使用和正则表达式更加熟悉。集合工具类Collections,

// 集合去重

ArrayList layers = layers.stream().distinct().collect(Collectors.*toList*());

这个方法是我之前从未接触过的集合去重,虽然集合去重的方法有很多。对于正则表达式的使用,首先写匹配的字符串^[0-9][0-2]?匹配 以数字开头并且只有一位,第二位数字匹配0-2的数字,匹配1次或0次,然后创建Pattern对象**Pattern p = Pattern.compile(regex)**;,然后获取matcher对象 Matcher matcher = p.matcher(str);,也可以简写成Pattern.matches(regex, input),返回值为布尔类型。

Integer.parseInt(str)Integer.valueOf(str)的区别,Integer.parseInt(str)是把字符串解析成int基本类型,**Integer.valueOf(s)**是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。

Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象,得到的对象有时是同一个对象,有时是不同的对象,要根据把s字符串解析的整数值的大小进行决定:如果s字符串对应的整数值在 -128~127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。不管对象是否相等,对象中的value值是相等的。

五、全部代码

package cn.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Elevator {

	// 当前层数
	private int currentLayer = 1;
	private int currentWeight = 0;
	private List<Integer> layers = new ArrayList<Integer>();;
	// 电梯最大重量1000kg
	final int CAPACITY = 1000;
	// 电梯最高层
	final int TOP_FLOOR = 12;
	// 电梯最低层
	final int BTOTTOM_FLOOR = 1;
	
	boolean isFirst = true;

	public static void main(String[] args) throws Exception {
		new Elevator().start();
	}

	public void start() throws InterruptedException {
		Scanner in = new Scanner(System.in);

		String flag;
		boolean isdigt = false;
		while (true) {
			System.out.println("*****该电梯总楼层为12层, 第一层编号为第1层");
			System.out.println("*****输入0 结束输入...");
			flag = null;
			isFirst = true;
			while (!"0".equals(flag)) {
				flag = in.next();
				isdigt = isDigit(flag);
				if (isdigt) {
					int num = Integer.parseInt(flag);
					if (num < 0 || num > TOP_FLOOR) {
                        System.err.println("输入有误,当前楼层最低1层, 最高12层.");
                        clear();
                        break;
                    }else if (num != 0){                    	
                    	layers.add(num);
                    }
				} else {
					System.err.println("输入有误, 禁止输入0-12外的字符和数字");
					clear();
					break;
				}
			}

			// 判断集合是否为空
			if (layers.size() > 0) {
				// 集合去重
				layers = layers.stream().distinct().collect(Collectors.toList());
				// 去除集合中的最后一个元素
//				layers.remove(layers.size() - 1);

				/*
				 * 首先获取向上
				 *
				 */
				int min = Collections.min(layers);
				int max = Collections.max(layers);
				if (currentLayer <= layers.get(0)) {
					goTop(max);
					if (!layers.isEmpty()) {
						goDown(min);
					}
				} else {
					goDown(min);
					if (!layers.isEmpty()) {
						goTop(max);
					}
				}
			}
			
			System.err.println("本次输入结束 ");
		}
	}

	/*
	 * Integer.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)
	 * 是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,
	 * 在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。
	 *
	 */
	public void goTop(Integer layer) throws InterruptedException {
		while (currentLayer <= layer) {
			System.out.println("---当前楼层: " + currentLayer + "---");
			Thread.sleep(600);
			if (layers.contains(currentLayer)) {
				System.err.println("---到达" + currentLayer + "楼, 开门!");
				layers.remove(Integer.valueOf(currentLayer));
				OverWeight();
				Thread.sleep(700);
			}
			currentLayer++;
		}
		currentLayer--;
	}

	public void goDown(Integer layer) throws InterruptedException {
		while (currentLayer >= layer) {
			System.out.println("---当前楼层: " + currentLayer + "---");
			Thread.sleep(600);
			if (layers.contains(currentLayer)) {
				System.err.println("---到达" + currentLayer + "楼, 开门!");
				layers.remove(Integer.valueOf(currentLayer));
				OverWeight();
			}
			Thread.sleep(600);
			currentLayer--;
		}
		currentLayer++;
	}

	public void OverWeight() throws InterruptedException {
		currentWeight = (int) (Math.random() * 1200);
		Thread.sleep(600);
		if (currentWeight > CAPACITY) {
			System.err.println("当前体重超重,无法关门");
		} else {
			System.out.println("当前体重为: " + currentWeight + "公斤");
		}
	}

	// 正则表达式判断输入是否为数字
	// @Test
	public boolean isDigit(String str) {
		String regex = "^[0-9]{1,2}";
		Pattern p = Pattern.compile(regex);
		// 获取matcher 对象
		Matcher matcher = p.matcher(str);
		return matcher.matches();
	}
	
	public void clear(){
		layers.clear();
	}

}

标题:模拟电梯系统(java)
作者:gitsilence
地址:http://blog.lacknb.cn/articles/2019/10/25/1577974166929.html