这个项目是模拟电梯运行的系统,一共12层,用户可以在每一层点击楼层,使电梯到达该楼层,并开门。电梯运行前会检查体重是否超重,如果超重,会提示。如果用户处于中间楼层,如果有向上的楼层和向下的楼层,系统会先判断第一个按的楼层与当前楼层相比较,如果大于当前楼层就先上后下,否则先下后上。
创建存储需要到达楼层输入集合ArrayList
获取集合中的最小值(min)和最大值(max)
向上走的函数 public void goTop(Integer layer)
向下走的函数 public void goDown(Integer layer)
如果电梯向上走,传给向上的函数 max值
如果电梯向下走,传给向下的函数 min值
每次到达指定的楼层集合元素去除一个
当电梯向上或者向下完成之后,判断当前集合是否为空,如果为空结束,不为空,反方向运行电梯。
3.1****项目设计规划(小四号宋体加粗)
public boolean isDigit(String str) 创建输入验证函数,保证输入的字符都是数字类型和指定范围的数字。
public void OverWeight()判断当前体重是否超重
向上走的函数 public void goTop(Integer layer)
向下走的函数 public void goDown(Integer layer)
5.集合的去重
3.2****实施方案
public static void main(String[] args) **throws** Exception {
new Elevator().start();
}
// 正则表达式判断输入是否为数字
// @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();
}
输入:
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();
}
}