java实现简单快递系统
作者:helloworld370629 发布时间:2021-11-28 07:01:57
标签:java,快递系统
本文实例为大家分享了java实现简单快递系统的具体代码,供大家参考,具体内容如下
创建四个类Express,Locker, User, Administrator分别模拟快递,快递柜,用户和管理员。
import java.util.Random;
import java.util.Scanner;
/**
* @author hxf
* * @date 2020/12/12
*/
public class Test {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
// 生成快递柜, 但在后续修改快递位置时没考虑越界问题
Locker locker = new Locker(10, 10);
// 创建管理员
Administrator administrator = new Administrator(locker);
//程序主逻辑
outer: while (true){
switch (login("请选择身份:(-1退出 0管理员身份 1用户身份)", 1)){
case -1:
break outer;
case 0:
switch (login("请选择操作:(-1退出 0快递录入 1删除快递 2修改快递 3查看快递)", 3)){
case -1:
break;
case 0:
in.nextLine();
System.out.println("请输入公司名称:");
System.out.println("取件码:"+administrator.store(in.nextLine()));
break;
case 1:
administrator.remove();
break;
case 2:
administrator.change();
break;
case 3:
administrator.show();
break;
}
break;
case 1:
switch (login("请选择操作:(-1退出 0取快递)", 0)){
case -1:
break;
case 0:
in.nextLine();
fetch(locker);
break;
}
break;
}
}
}
// 生成有效选择,处理无效选择产生的异常
public static int login(String string, int n){
try{
System.out.println(string);
int select = in.nextInt();
if (select > n || select < -1){
System.out.println("请输入有效选择!");
in.nextLine();
return login(string, n);
}
return select;
}catch (Exception e){
System.out.println("请输入有效选择!");
in.nextLine();
return login(string, n);
}
}
// 用户取快递,确保输入有效验证码
public static void fetch(Locker locker){
System.out.println("请输入六位验证码:");
String code = in.nextLine();
User user = new User(code, locker);
if (user.fetch()){
System.out.println("取件成功");
}else {
System.out.println("验证码有误,请重新输入!");
fetch(locker);
}
}
}
class Express {
/**
* @param code: 6位验证码,数字字符串
* @param company: 公司名称
* @param number: 14位快递单号, 数字字符串
* @param position: 快递存放位置
* @author hxf
* @describe: 快递
* @date 2020/12/11 1:17
*/
private final String code;
private String company;
private final String number;
private int[] position;
public Express(String code, String company, String number, int[] position) {
this.code = code;
this.company = company;
this.number = number;
this.position = position;
}
public String getCode() {
return code;
}
public String getCompany() {
return company;
}
public String getNumber() {
return number;
}
public int[] getPosition() {
return position;
}
public void setCompany(String company) {
this.company = company;
}
public void setPosition(int row, int column) {
this.position[0] = row;
this.position[1] = column;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("快递信息简介{");
stringBuilder.append("快递公司:");
stringBuilder.append(company);
stringBuilder.append(", 快递单号:");
stringBuilder.append(number);
stringBuilder.append(", 存放位置:");
stringBuilder.append("第");
stringBuilder.append(position[0]);
stringBuilder.append("排,第");
stringBuilder.append(position[1]);
stringBuilder.append("列");
return stringBuilder.toString();
}
}
class Locker {
/**
* @param code: 存储Express
* @param random: 随机数生成器
* @param position: 存放临时快递位置
* @param LENGTH_OF_CODE: 验证码长度
* @author hxf
* @describe: 快递柜
* @date 2020/12/11 1:25
*/
Express[][] code;
Random random;
int[] position;
private final int LENGTH_OF_CODE = 6;
private final int LENGTH_OF_NUMBER = 14;
public Locker(int row, int column){
code = new Express[row][column];
random = new Random();
position = new int[2];
}
// 生成验证码
public String generateCode(){
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < LENGTH_OF_CODE; i++){
stringBuilder.append(random.nextInt(10));
}
String string = stringBuilder.toString();
checkCode(string);
return position[0] == -1 ? string : generateCode();
}
// 生成快递单号
public String generateNumber(){
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < LENGTH_OF_NUMBER; i++){
stringBuilder.append(random.nextInt(10));
}
String string = stringBuilder.toString();
checkNumber(string);
return position[0] == -1 ? string : generateNumber();
}
//生成存放位置
public int[] generatePosition(){
int row = random.nextInt(code.length);
int column = random.nextInt(code[0].length);
if (code[row][column] != null){
return generatePosition();
}else{
position[0] = row;
position[1] = column;
return position;
}
}
// 检查有无重复验证码,有则将position改成相应位置,无则position第一个元素为-1
public void checkCode(String string){
position[0] = -1;
outer: for (int i = 0; i < code.length; i++){
for (int j = 0; j < code[0].length; j++) {
if (code[i][j] != null && code[i][j].getCode().equals(string)) {
position[0] = i;
position[1] = j;
break outer;
}
}
}
}
// 检查有无重复快递单号
public void checkNumber(String string){
position[0] = -1;
outer: for (int i = 0; i < code.length; i++){
for (int j = 0; j < code[0].length; j++) {
if (code[i][j] != null && code[i][j].getNumber().equals(string)) {
position[0] = i;
position[1] = j;
break outer;
}
}
}
}
// 将快递存入快递柜
public String store(Express express){
code[position[0]][position[1]] = express;
return express.getCode();
}
public void store(Express express, int row, int column){
code[row][column] = express;
}
// 取出快递
public Express fetch(){
Express express = code[position[0]][position[1]];
code[position[0]][position[1]] = null;
return express;
}
public int[] getPosition() {
return position;
}
// 打印所有快递信息
public void check(){
int count = 0;
for (Express[] expresses: code){
for (Express express : expresses){
if (express != null){
System.out.println(express.toString());
count++;
}
}
}
if (count == 0){
System.out.println("无快递");
}
}
}
class User {
/**
*@Param: code: 验证码
*@Param: locker: 快递柜
*@Author: hxf
*@date: 2020/12/12
*/
private final String code;
private Locker locker;
public User(String code, Locker locker) {
this.code = code;
this.locker = locker;
}
// 取快递
public boolean fetch(){
locker.checkCode(code);
if (locker.getPosition()[0] == -1){
return false;
}else {
System.out.println(locker.fetch().toString());
return true;
}
}
}
class Administrator {
/**
*@Param: locker: 快递柜
*@Author: hxf
*@date: 2020/12/12
*/
Locker locker;
Scanner in = new Scanner(System.in);
public Administrator(Locker locker) {
this.locker = locker;
}
// 录入快递
public String store(String company){
String number = locker.generateNumber();
String code = locker.generateCode();
int[] position = locker.generatePosition();
return locker.store(new Express(code, company, number, position));
}
// 删除快递
public void remove(){
System.out.println("请输入14位快递单号:");
String number = in.nextLine();
locker.checkNumber(number);
if (locker.getPosition()[0] != -1){
System.out.println("单号为"+locker.fetch().getNumber()+"的快递已经删除");
}else{
System.out.println("快递单号不存在,请重试");
remove();
}
}
// 修改快递
public void change(){
System.out.println("请输入14位快递单号:");
String number = in.nextLine();
locker.checkNumber(number);
if (locker.getPosition()[0] != -1){
Express express = locker.fetch();
System.out.println("请输入新的快递公司:");
express.setCompany(in.nextLine());
System.out.println("请输入新的位置:(先行后列,空格隔开)");
int row = in.nextInt();
int column = in.nextInt();
express.setPosition(row, column);
locker.store(express, row, column);
System.out.println("修改成功!");
}else{
System.out.println("快递单号不存在,请重试");
change();
}
}
// 显示所有快递信息
public void show(){
locker.check();
}
}
来源:https://blog.csdn.net/helloworld370629/article/details/111062436
0
投稿
猜你喜欢
- 在AccessibilityService中我们可以做模拟操作,下面记述下通过AccessibilityService实现微信发红包的功能1
- using System; using System.Collections.Generic; using System.Text; usi
- 在之前文章的铺垫下,再为大家分享一篇:Android手势密码,附源码下载,不要错过。源码下载:http://xiazai.jb51.net/
- 一、wapper介绍Wrapper : 条件构造抽象类,最顶端父类AbstractWrapper : 用于查询条件封装,生成 sql 的 w
- 最近项目中用到的两种文件上传方式做一下总结:一. uploadify:uploadify控件的scripts和styles在这里:图片上传J
- sidebarDepth: 3条件构造器说明以下出现的第一个入参boolean condition表示该条件是否加入最后生成的SQL中,例如
- 看代码吧~package com.mtpc.admin.controller.exportSql;import ch.qos.logback
- 本文实例讲述了java简单列出文件夹下所有文件的方法。分享给大家供大家参考,具体如下:import Java.io.*;public cla
- 编写Job定时执行任务十分有用,能解决很多问题,这次实习的项目里做了一下系统定时更新三方系统订单状态的功能,这里用到了Spring的定时任务
- 前言相对来说呢,jpg格式的相对来说容易破解一点,当然也取决于你的干扰元素,元素越复杂,破解也就难度越高,有的加的多,人都识别不出来了,何况
- 一、序言Kotlin挂起函数平时在学习和工作中用的比较多,掌握其原理还是很有必要的。本文将一步一步带着大家分析其原理实现。ps: 文中所用的
- 最近想关闭一个包的日志打印,经过一番研究实际上就一句话的事,一直没成功是因为name写错了。<logger name="pa
- 要求:1.配置文件的namespace名称空间指定为接口的全类名2.配置文件中的id唯一标识与接口中的方法对应(返回值类型对应,方法名对应,
- 在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求。由于这种限制不方便,所以出现了ArrayList。ArrayList、Lis
- 在spring的注解 @RequestMapping 之下可以直接获取 HttpServletRequest 来获得诸如request he
- Unity OnOpenAsset在Unity中,OnOpenAsset是一个非常有用的回调函数,它可以在用户双击资源文件时自动打开一个编辑
- Spring Boot除了可以打可执行jar包外,也支持传统的war包。本文介绍如何使用Spring Boot构建传统war包。Spring
- 相信各位同道在写代码的时候,肯定会写一些日志打印,因为这对往后的运维而言,至关重要的。那么我们请求一个restfull接口的时候,哪些信息是
- MS的CMD命令行是一种重要的操作界面,一些在C#中不那么方便完成的功能,在CMD中几个简单的命令或许就可以轻松搞定,如果能在C#中能完成C
- FloatingActionButton项目在github上的主页:https://github.com/futuresimple/andr