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方法不能同时解决两个问题,但是可以先解决一个码的问题。*/@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(num);}@Overridepublic 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-999999int 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("操作成功");}}
