任务概述
-
管理员
-
快递录入
- 柜子位置(系统产生不能重复)
- 快递单号(输入产生)
- 快递公司(输入产生)
- 6位取件码(系统产生不能重复)
-
删除快递(根据单号)
-
修改快递(根据单号)
-
查看所有快递(遍历)
-
-
普通用户
-
快递取出
- 输入取件码:显示快递信息和哪个柜子中,从柜子中移除这个快递
-
程序思路
1.视图和部分功能(view)
呈现给用户所看到的界面和大致的功能,如:文字提示等等。
同时让自己写程序有一个大局观,知道下一步该做什么。
2.通用对象方法(express)
建立通用方法和对象,方便使用
3主程序(main)
用主程序调用之前的视图和功能类方法,直接连接运行
程序分解
1.View
需要实现的内容:
(1)欢迎和再见
(2)选择管理员或者用户身份菜单(判断输入参数要合理)
(3)快递员浏览的菜单、用户浏览的菜单(判断输入参数要合理)
(4)快递删除:是否删除界面(判断输入参数要合理)
(5)提示存取错误:快递不存在、已存在的提示语
考察点:字符串转数字Integer.parseInt(text)、异常处理NumberFormatException、返回数据类型
1)欢迎和再见
public void welcome() {
System.out.println("欢迎使用XXX快递管理系统!");
}
public void bye() {
System.out.println("再见,欢迎下次使用!");
}
2)选择管理员或者用户身份菜单
public int menu() {
//提示用户输入
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
//接收输入内容存储到text
String text = input.nextLine();
//异常处理
int num = -1;
try {
//字符串转数字
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
//判断,防止用户误操作
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入0-2之间的功能序号:");
//返回menu让用户重新输入
return menu();
}
return num;
}
3)快递员浏览的菜单、用户浏览的菜单(判断输入参数要合理)
//快递员浏览的菜单
public int cMenu(){
//提示用户
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递录入");
System.out.println("2.快递修改");
System.out.println("3.快递删除");
System.out.println("4.查看所有快递");
System.out.println("0.返回上级目录");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 4 ) {
System.out.println("输入错误,请重新输入0-4的功能序号:");
return cMenu();
}
return num;
}
//用户浏览的菜单
public int uMenu(){
//提示用户
System.out.println("请根据提示,进行取件:");
System.out.println("请输入您的取件码:");
//接收用户输入的取件码存储到变量code
String code = input.nextLine();
//异常处理
int num = -1;
try {
num = Integer.parseInt(code);
}catch(NumberFormatException e) {
}
//判断是否为6位数取件码
if ( num < 100000 || num > 999999 ) {
System.out.println("输入错误,请重新输入6位取件码:");
//不是让用户重新输入
return uMenu();
}
return num;
}
4)快递删除:是否删除界面(判断输入参数要合理)
public int delete() {
//提示用户输入
System.out.println("是否确认删除:");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
//接收用户输入的取件码存储到变量text
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入:");
return delete();
}
return num;
}
5)提示存取错误:快递不存在、已存在的提示语
public void expressExit(){
System.out.println("此单号在快递柜中已存在,请勿重复存储!");
}
public void printNull(){
System.out.println("快递不存在,请检查输入!");
}
2.Express
需要实现的内容:
(1)创建快递对象
(2)无参构造方法
(3)有参构造方法
(4)Getter和Setter方法
(5)equals()和hashCode方法
(6)toString()方法
public Express(String number) {
this.number = number;
}
public Express(String number, String company, int code, int x, int y) {
this.number = number;
this.company = company;
this.code = code;
this.x = x;
this.y = y;
}
public String getNumber() {
return number;
}
public String getCompany() {
return company;
}
public int getCode() {
return code;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setNumber(String number) {
this.number = number;
}
public void setCompany(String company) {
this.company = company;
}
public void setCode(int code) {
this.code = code;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return code == express.code &&
x == express.x &&
y == express.y &&
Objects.equals(number, express.number) &&
Objects.equals(company, express.company);
}
@Override
public int hashCode() {
return Objects.hash(number, company, code, x, y);
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
", x=" + x +
", y=" + y +
'}';
}
}
3.main
主程序需要实现的内容:
调用欢迎和再见
(1)case选择
(2)生成快递信息
(3)修改快递信息
(4)删除快递信息
(5)查询快递信息
1)case选择
//快递员菜单
m:while (true) {
int menu = v.menu();
switch (menu) {
case 0: // 退出
v.bye();
break m;
case 1: // 快递员
cClient();
break;
case 2: // 普通用户
uClient();
break;
}
}
while (true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1:{ // 快递录入
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.println("请输入快递单号:");
String number = input.nextLine();
// 内容
}
break;
case 2: { // 快递修改
System.out.println("请输入要修改的快递单号:");
String oldExpressNumber = input.nextLine();
// 内容
}
break;
case 3 : { // 快递删除
System.out.print("请输入要删除的快递单号:");
String delExpressNumber = input.nextLine();
// 内容
}
break;
case 4 :{ // 查看所有快递
// 内容
}
break;
}
}
2)生成快递信息(快递录入)
// 随机生成不重复的六位数取货码
int code = 0;
do{
code = random.nextInt(900000)+100000;
}while(expressMap.get(code) != null); // Hashmap保证不重复
// 生成 不重复 的快递位置
int x = -1;
int y = -1;
do{
x = random.nextInt(10);
y = random.nextInt(10);
}while(expressMap.get(x) != null && expressMap.get(y) != null);
// 创建一个快递对象
Express e = new Express(number,company,code,x,y);
expressMap.put(number, e);
System.out.println("恭喜你,快递存储成功!");
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
//记录存储的快递数
count++;
System.out.println("当前快递存储数为:"+count);
3)修改快递信息
System.out.println("请输入新的快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();//接收输入
System.out.print("请输入新的快递单号:");
String newExpressNumber = input.nextLine();//接收输入
//找到旧的快递取件码和位置
int code = expressMap.get(oldExpressNumber).getCode();
int x = expressMap.get(oldExpressNumber).getX();
int y = expressMap.get(oldExpressNumber).getY();
//更新新的快递数据
Express e = new Express(newExpressNumber,company,code,x,y);
//删除之前的快递单号
expressMap.remove(oldExpressNumber);
expressMap.put(newExpressNumber, e);
System.out.println("恭喜你,快递信息修改成功!");
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
4)删除快递信息
int type = v.delete();
if (type == 1) {
// 取货码 存储位置 快递 信息清空
expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
expressMap.remove(delExpressNumber);
System.out.println("恭喜你,快递删除成功!");
//减去快递删除数量
count --;
System.out.println("当前快递存储数为:"+count);
5)查询快递信息
// 查看所有快递
for (String number : expressMap.keySet()) {
Express e = expressMap.get(number);
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列")
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
//根据单号查找快递
for (String number : expressMap.keySet()) {
temp ++ ;
// 单号存在
if (expressMap.get(number).getCode() == code ){
String s = number;
Express e = expressMap.get(s);
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
// 用户取件后删除之前的数据
System.out.println("取货成功!");
expressMap.remove(e.getCode());
expressMap.remove(e.getX());
expressMap.remove(e.getY());
expressMap.remove(e.getNumber());
count --;
break;
// 单号不存在
} else if (count == temp ){
//调用视图View里的printNull提示用户
v.printNull();
}
完整代码
View视图界面
import java.util.Scanner;
public class View {
private Scanner input = new Scanner(System.in);
// 欢迎与再见
public void welcome() {
System.out.println("欢迎使用XXX快递管理系统!");
}
public void bye() {
System.out.println("欢迎下次使用!");
}
// 选择身份的菜单
public int menu() {
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入:");
return menu();
}
return num;
}
// 快递员浏览的菜单
public int cMenu(){
System.out.println("请根据提示,输入功能序号:");
System.out.println("1.快递录入");
System.out.println("2.快递修改");
System.out.println("3.快递删除");
System.out.println("4.查看所有快递");
System.out.println("0.返回上级目录");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 4 ) {
System.out.println("输入错误,请重新输入:");
return cMenu();
}
return num;
}
// 用户浏览的菜单
public int uMenu(){
System.out.println("请根据提示,进行取件:");
System.out.println("请输入您的取件码:");
String code = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(code);
}catch(NumberFormatException e) {
}
if ( num < 100000 || num > 999999 ) {
System.out.println("输入错误,请重新输入:");
return uMenu();
}
return num;
}
// 询问是否删除
public int delete() {
System.out.println("是否确认删除:");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if ( num < 0 || num > 2 ) {
System.out.println("输入错误,请重新输入:");
return delete();
}
return num;
}
public void expressExit(){
System.out.println("此单号在快递柜中已存在,请勿重复存储!");
}
public void printNull(){
System.out.println("快递不存在,请检查输入!");
}
}
Express对象方法
import java.util.Objects;
public class Express {
private String number; // 快递单号
private String company; // 快递公司
private int code; // 取件码
private int x; // 快递箱排数
private int y; // 快递箱列数
public Express(String number) {
this.number = number;
}
public Express(String number, String company, int code, int x, int y) {
this.number = number;
this.company = company;
this.code = code;
this.x = x;
this.y = y;
}
public String getNumber() {
return number;
}
public String getCompany() {
return company;
}
public int getCode() {
return code;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setNumber(String number) {
this.number = number;
}
public void setCompany(String company) {
this.company = company;
}
public void setCode(int code) {
this.code = code;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return code == express.code &&
x == express.x &&
y == express.y &&
Objects.equals(number, express.number) &&
Objects.equals(company, express.company);
}
@Override
public int hashCode() {
return Objects.hash(number, company, code, x, y);
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
", x=" + x +
", y=" + y +
'}';
}
}
Main主程序
import java.util.*;
public class main {
private static View v = new View();
private static Map<String, Express> expressMap = new HashMap<>();
private static Scanner input = new Scanner(System.in);
private static Random random = new Random();
private static int count;
public static void main(String[] args) {
v.welcome();
// 身份选择菜单
m:while (true) {
int menu = v.menu();
switch (menu) {
case 0: // 退出
v.bye();
break m;
case 1: // 快递员
cClient();
break;
case 2: // 普通用户
uClient();
break;
}
}
}
// 快递员菜单
private static void cClient() {
while (true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1:{ // 快递录入
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.println("请输入快递单号:");
String number = input.nextLine();
if (expressMap.get(number) != null) {
v.expressExit();
} else {
// 生成 不重复 的六位数取货码
int code = 0;
do{
code = random.nextInt(900000)+100000;
}while(expressMap.get(code) != null);
// 生成 不重复 的快递位置
int x = -1;
int y = -1;
do{
x = random.nextInt(10);
y = random.nextInt(10);
}while(expressMap.get(x) != null && expressMap.get(y) != null);
Express e = new Express(number,company,code,x,y);
expressMap.put(number, e);
System.out.println("快递存储成功!");
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
count++;
System.out.println("当前快递存储数为:"+count);
}
}
break;
case 2: { // 快递修改
System.out.println("请输入要修改的快递单号:");
String oldExpressNumber = input.nextLine();
if (expressMap.get(oldExpressNumber) == null) {
v.printNull();
} else {
System.out.println("请输入新的快递信息:");
System.out.println("请输入快递公司:");
String company = input.nextLine();
System.out.print("请输入新的快递单号:");
String newExpressNumber = input.nextLine();
int code = expressMap.get(oldExpressNumber).getCode();
int x = expressMap.get(oldExpressNumber).getX();
int y = expressMap.get(oldExpressNumber).getY();
Express e = new Express(newExpressNumber,company,code,x,y);
expressMap.remove(oldExpressNumber);
expressMap.put(newExpressNumber, e);
System.out.println("恭喜你,快递信息修改成功!");
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
}
}
break;
case 3 : { // 快递删除
System.out.print("请输入要删除的快递单号:");
String delExpressNumber = input.nextLine();
if (expressMap.get(delExpressNumber) == null) {
v.printNull();
} else {
int type = v.delete();
if (type == 1) {
// 取货码 存储位置 快递 信息清空
expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
expressMap.remove(delExpressNumber);
System.out.println("快递删除成功!");
count --;
System.out.println("当前快递存储数为:"+count);
}
}
}
break;
case 4 :{ // 查看所有快递
for (String number : expressMap.keySet()) {
Express e = expressMap.get(number);
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
}
System.out.println("当前快递存储数为:"+count);
break;
}
}
}
}
private static void uClient() {
int code = v.uMenu();
int temp = 0;
// 根据code找快递单号
for (String number : expressMap.keySet()) {
temp ++ ;
// 单号存在
if (expressMap.get(number).getCode() == code ){
String s = number;
Express e = expressMap.get(s);
System.out.println("快递存放在第[" + (e.getX() + 1) + "]排第[" + (e.getY() + 1) + "]列");
System.out.println("快递信息:"+"快递公司:[" + e.getCompany() + "],快递号单号:[" + e.getNumber() + "]," +"取件码:[" + e.getCode() + "]");
// 用户取件后
System.out.println("取货成功!");
expressMap.remove(e.getCode());
expressMap.remove(e.getX());
expressMap.remove(e.getY());
expressMap.remove(e.getNumber());
count --;
break;
// 单号不存在
} else if (count == temp ){
v.printNull();
}
}
}
}
实现效果
录入
删除
用户取件