Express:快递属性类
import java.util.Objects;
public class Express {
private String num; //快递单号
private String company;//快递公司
private int code;//快递取件码
public Express() {
}
public Express(String num, String company, int code) {
this.num = num; this.company = company; this.code = code; }
public void setNum(String num) {
this.num = num; }
public void setCompany(String company) {
this.company = company; }
public void setCode(int code) {
this.code = code; }
public String getNum() {
return num; }
public String getCompany() {
return company; }
public int getCode() {
return code; }
/* 在管理系统中,有两个值需要比较:
1.对于快递员来说,需要根据快递码是否相同来执行删除或修改快递。
2.对于用户来说,需要根据取件码是否相同来执行取件操作。
3.equals方法不能同时解决两个问题,但是可以先解决一个码的问题。
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
Express express = (Express) o;
return Objects.equals(num, express.num);
}
@Override
public int hashCode() {
return Objects.hash(num);
}
@Override
public String toString() {
return "Experss{" +
"num='" + num + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}'; }
}
Main:
import java.util.List;
public class Main {
private static Views views = new Views(); //初始化视图对象
private static ExpressDao dao = new ExpressDao(); //初始化dao对象
public static void main(String[] args) {
//1.欢迎
views.welcome();
m: while (true) {
//2.弹出身份选择菜单
int menu = views.menu();
switch (menu) {
case 0:
break m; //跳出m循环
case 1:
cClient(); //调用快递员的客户端
break ;
case 2:
uClient();//调用用户的客户端 Client:客户端
break ;
}
}
views.bye();
}
private static void uClient() {
//1.取件码获取
int code = views.uMenu();
//2.根据取件码取出快递
Express e = dao.findByCode(code);
if(e==null){
views.printNull();
}
else{
views.succeed();
views.printExpress(e);
dao.delete(e);
}
}
private static void cClient() {
while (true) {
int menu = views.cMenu();//快递员菜单
switch (menu) {
case 0:
return ;
case 1: { //加入大括号,使得e成为局部对象,以便我们每个case都用一个对象名但不受到干扰
/**
* 快递录入
*/
//1.提示输入快递信息
Express e = views.insert(); //e是快递信息对象
//2.此快递是否储存过
Express e2 = dao.findByNumber(e.getNum());
//3.存储快递
if(e2==null){
//单号未储存过,存入快递
dao.Add(e);
views.printExpress(e);//打印快递信息
}
else{
//单号在快递柜中已存在
views.expressExist();
}
}
break;
case 3:{
/**
* 快递修改
*/
//1.提示输入快递信息
String number = views.findByNumber();
//2.查找数据
Express e = dao.findByNumber(number);
//3.打印快递信息
if(e ==null){
views.printNull();
}
else {
views.printExpress(e); //打印快递信息
}
//4.提示修改
views.update(e);
dao.update(e,e); //这个update没什么意义
views.printExpress(e); //打印修改后的快递信息
}
break;
case 2:{
/**
* 删除
*/
//1.输入快递单号
String number = views.findByNumber();
//2.查找快递对象
Express e = dao.findByNumber(number);
if(e==null ){
views.printNull();
}
else {
views.printExpress(e);
int type = views.delete();
if(type == 1){
dao.delete(e);
views.succeed();
}
}
}
break;
case 4:{
/**
* 查看所有
*/
List<Express> data = dao.findAll();
views.printAll(data);
}
break;
}
}
}
}
ExpressDao:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ExpressDao {
private ArrayList<Express> data = new ArrayList<>();//模拟一维快递柜
private int size; //当前储存快递数
private Random random = new Random(); //随机取件码对象
/**
* 用于存储快递
*
* @param e :快递信息对象(快递单号,快递公司)
* @return :返回是否成功存储信息。
*/
public boolean Add(Express e) {
if (size == 100) { //如果快递柜满了,直接返回false给add函数,表示存储失败
return false;
}
A: for (int i=0;i<data.size();i++){
if (data.get(i)==null){
//此位置无快递
break A;
}
}
// 2. 取件码
int code = randomCode();
e.setCode(code);
return data.add(e); //储存快递信息
}
/**
* 生成随机取件码
*
* @param
*/
private int randomCode() {
while (true) { //如果取件码取不到快递,就会返回code,如果取件码取到了快递,继续循环
//六位数的随机码的正确范围应该是:100000-999999
int code = random.nextInt((900000) + 100000);
//范围应该是10000-(899999+100000)
Express e = findByCode(code);
if (e == null) { //生成的取件码在已生成的取件码中不存在的
return code;//生成取件码成功,返回取件码
}
}
}
/**
* 通过快递单号进行查询
*/
public Express findByNumber(String number) {
//Express e = new Express();
//e.setNum(number);
for (Express express:data){
if (number.equals(express.getNum())){
return express;
}
}
return null;
}
/**
* 根据取件码查询快递
*
* @param code 要查询的取件码
* @return 查询失败时返回null
*/
//通过取件码领取快递
public Express findByCode(int code) {
for (Express express:data){
if (express!=null){
if (express.getCode()==code){
return express;
}
}
}
return null;
}
/**
* 多余的操作,为了MVC更圆满
* @param oldexpress
* @param newexpress
*/
//修改
//得到的数据:1.原单号2.查到的原对象3.用户修改的信息
//步骤:1.先查找到原单号。2.修改。3.把原单号的对象delete。4.重新存储(重新存储(即调用add(),并生成新的取件码)
public void update(Express oldexpress, Express newexpress) {
delete(oldexpress); //删除旧单号
Add(newexpress);//添加新单号
}
//删除
public boolean delete(Express e) {
return data.remove(e);
}
//返回所有快递
public List<Express> findAll() {
return data;
}
}
Views:
import java.util.List;
import java.util.Scanner;
public class Views {
private Scanner input = new Scanner(System.in);
/**
* 欢迎
*/
public void welcome(){
System.out.println("欢迎使用xxx快递管理系统");
}
/**
* 再见
*/
public void bye(){
System.out.println("欢迎下次使用!");
}
/**
* 选择身份菜单
* @return
*/
public int menu(){
System.out.println("请根据提示,输入功能序号:");
System.out.println("1:快递员");
System.out.println("2:普通用户");
System.out.println("0:退出");
/*
这里的代码逻辑,相较于nextInt优点在哪?
单思考这个方法内的逻辑,没有什么优点。
但是思考全局代码,是有优点:所有方法均使用nextLine,不会因为输入产生冲突,还可以更好的接受各种类型的数据。
1.nextLine()与其他next方法会有冲突,只能使用一个。
2.在其他视图的用户输入,其内容不仅仅是整型数字,还有可能是其他基本类型。
3.因此,我们统一使用nextLine()来接受用户的输入
*/
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(); //重新调用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(); //重新调用cmenu,让他重新输入
}
return num;
}
/**
* 快递员录入快递
* @return :包含了快递单号和快递公司的快递对象。
*/
public Express insert() { //这里的Experss表示函数返回值是Experss对象类型
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入快递公司:");
String company = input.nextLine();
Express e = new Express();
e.setCompany(company);
e.setNum(number);
return e;
}
/**
* 提示用户输入快递单号
* @return
*/
//编写查询单号的方法,以便重复利用
public String findByNumber(){
System.out.println("请根据提示,输入快递信息:");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
/**
* 显示快递信息
* @param e
*/
//编写打印快递信息的方法,以便重复利用,给予用户确认输入信息是否有误。
public void printExpress(Express e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+",快递单号:"+e.getNum()+",取件码:"+e.getCode());
}
/**
* 修改快递信息
* @param e
*/
public void update(Express e){
System.out.println("请根据提示,输入新的快递单号:");
String number2 = input.nextLine();
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
e.setNum(number2); //修改快递单号
e.setCompany(company); //修改快递公司
}
/**
* 询问是否删除快递信息
* @return 1表示确认,2表示取消操作
*/
public int delete(){
System.out.println("是否确认删除 y/n?");
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<1||num>2){
System.out.println("输入有误,请重新输入!");
return delete(); //重新调用delete,让他重新输入
}
return num;
}
/**
* 给定数组快递信息,遍历显示
* @return
*/
public void printAll(List<Express> data){
int count = 0;
for (Express express:data){
printExpress(express);
}
if(count==0){
System.out.println("暂无快递信息");
}
}
/**
* 用户菜单
*/
public int uMenu(){
System.out.println("请根据提示,进行取件:");
System.out.println("请输入您的取件码:");
String code = input.nextLine(); //这个取件码要return的,但是return接收的类型是Int,所以要转一下星。
int num = -1;
try {
num = Integer.parseInt(code);
}
catch (NumberFormatException e){
}
if(num<100000||num>999999){ //此判断条件是确保输入的是6位数
System.out.println("输入有误,请重新输入!");
return uMenu(); //重新调用umenu,让他重新输入
}
return num;
}
public void expressExist(){
System.out.println("此单号在快递柜中已存在,请勿重复存储");
}
public void printNull(){
System.out.println("快递不存在,请检查您的输入");
}
public void printcode(Express e){
System.out.println("快递的取件码为:"+e.getCode());
}
public void succeed(){
System.out.println("操作成功");
}
}