快递e栈(控制台简易版)——集合

基础版可参考文章:快递e栈(控制台简易版)——最最最基础

二维数组储存版可参考文章: 快递e栈(控制台简易版)——异常处理

IO流文件存储版可参考文章: 快递e栈(控制台简易版)——IO流

快递e栈(控制台简易版)——集合

考察内容:面向对象 + 集合

本节任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图。
在这里插入图片描述

任务过程

​ 1. 明确需求,基于面向对象思想,创建用户类和快递类

​ 2. 选择合适的集合保存快递信息,这里涉及到根据指定单号快速定位到快递信息,结合每个集合的特点,这里建议使用 Map 集合进行 数据存储,key为快递单号,value 为快递对象

​ 3. 根据需求定义方法,完成上诉功能

​ 4. 测试

项目模块分析如图

在这里插入图片描述

  1. V视图展示(欢迎,菜单,子菜单…)
  2. D数据存取(快递数据)//集合
  3. C调度逻辑(根据视图接受到的用户输入内容,调度数据存取)
  4. 快递类(初始化快递)
  5. 自定义异常
  6. main

代码实现如下

1. ExpressView类

//将同一包下的子包中的类导入进来,这三行代码需自行导包,不能直接复制

import mission.demo03.exception.OutNumberBoundException;
import mission.demo03.dao.ExpressDao;
import mission.demo03.express.Express;

import java.util.Map;
import java.util.Scanner;

//视图展示的view层
public class ExpressView {

    static Scanner input = new Scanner(System.in);
    static ExpressDao dao = new ExpressDao();

    //欢迎界面
    public static void welcome(){
        System.out.println("=====欢迎使用快递e栈快递柜=====");
    }
    //退出界面
    public static void bye(){
        System.out.println("=====系统已退出,感谢您的使用=====");
    }
    //主菜单
    public static int mainMenu(){
        int mainNum = 0;
        do{
            welcome();
            System.out.println("请选择您的身份:");
            System.out.println("1.管理员");
            System.out.println("2.普通用户");
            System.out.println("0.退出");
            String s = input.nextLine();
            try{
                mainNum = validNum(s,0,2);
                break;
            }catch(NumberFormatException | OutNumberBoundException e){
                System.out.println(e.getMessage());
            }
        }while(true);
        return mainNum;
    }
    //判断输入的数字是否正确
    private static int validNum(String s,int begin,int end) throws NumberFormatException, OutNumberBoundException {
        try{
            int num = Integer.parseInt(s);
            if (num < begin || num > end){
                throw new OutNumberBoundException("数字的范围必须在" + begin + "和" + end +"之间");
            }
            return num;
        }catch(NumberFormatException e){
            throw new NumberFormatException("输入的必须是数字!");
        }
    }
    //管理员菜单
    public static int managerMain(){
        int managerNum = 0;
        do{
            System.out.println("请选择您要进行的操作:");
            System.out.println("1.录入快递");
            System.out.println("2.删除快递");
            System.out.println("3.修改快递");
            System.out.println("4.查看所有快递");
            System.out.println("0.返回上一级界面");
            String s = input.nextLine();
            try{
                managerNum = validNum(s,0,4);
                break;
            }catch(NumberFormatException | OutNumberBoundException e){
                System.out.println(e.getMessage());
            }
        }while(true);
        return managerNum;
    }
    //录入快递
    public static Express insertExpress(){
        System.out.print("请输入快递单号:");
        String number = input.nextLine();
        System.out.print("请输入快递公司:");
        String company = input.nextLine();
        Express e = new Express();
        e.setNumber(number);
        e.setCompany(company);
        return e;
    }
    //删除快递
    public static int isDeleteExpress() throws NumberFormatException, OutNumberBoundException {
        do{
            System.out.println("是否进行删除操作?");
            System.out.println("1.确认删除");
            System.out.println("0.取消操作");
            String s = input.nextLine();
            int deleteNum = -1;
            try{
                deleteNum = validNum(s,0,1);
                return deleteNum;
            }catch(NumberFormatException | OutNumberBoundException e){
                System.out.println(e.getMessage());
            }
        }while(true);
    }
    //修改快递
    public Express updateExpress(){
        Express e = new Express();
        String number;
        do{//如果快递单号已经存在,则重新输入
            System.out.print("请输入新的快递单号:");
            number = input.nextLine();
            if(dao.findExpressIsExist(number) == 1){
                hasExist();
            }
        }while(dao.findExpressIsExist(number) == 1);
        System.out.print("请输入新的快递公司:");
        String company = input.nextLine();
        e.setNumber(number);
        e.setCompany(company);
        return e;
    }
    //打印所有快递信息
    public static void printAllExpress(Map<String, Express> expressMap){
        System.out.println("当前快递柜存储情况:");
        for(Express express:expressMap.values()){//遍历
            printExpress(express);//打印单个快递信息
        }
    }
    //打印一个快递信息
    public static void printExpress(Express e){
        System.out.println(e.toString());
    }
    //打印快递位置信息
    public static void printExpressLocation(Express e){
        System.out.println("您的快递存储在快递柜的第" + (e.getX() + 1) + "排,第" + (e.getY() + 1) + "列,取件愉快~");
    }
    //用户菜单(其实是有点多余的,但是为了体现视图的圆润性)
    public static int userMain(){
        int userNum = 0;
        do{
            System.out.println("请选择您要进行的操作:");
            System.out.println("1.取出快递");
            System.out.println("0.返回上一级界面");
            String s = input.nextLine();
            try{
                userNum = validNum(s,0,1);
                break;
            }catch(NumberFormatException | OutNumberBoundException e){
                System.out.println(e.getMessage());
            }
        }while(true);
        return userNum;
    }
    //输入取件码
    public static int findByCode(){
        int code = -1 ;
        do{
            System.out.print("请输入取件码:");
            String s = input.nextLine();
            try{
                code = validNum(s,100000,999999);
                break;
            }catch(NumberFormatException | OutNumberBoundException e){
                System.out.println(e.getMessage());
            }
        }while(true);
        return code;
    }
    //输入快递单号
    public static String findByNumber(){
        System.out.print("请输入快递单号:");
        String s = input.nextLine();
        return s;
    }
    //操作成功
    public static void success(){
        System.out.println("操作成功!");
    }
    //快递单号已经存在
    public static void hasExist(){
        System.out.println("该单号已经存在!");
    }
    //快递单号不存在
    public static void noExist(){
        System.out.println("快递不存在!");
    }
}

2. ExpressDao类

//将同一包下的子包中的类导入进来,此行代码需自行导包,不能直接复制

import mission.demo03.express.Express;

import java.util.Map;
import java.util.Random;
import java.util.TreeMap;

//数据存取的dao层
public class ExpressDao {

    //用的是TreeMap,因为可以在输出所有快递的时候自动排序,让程序看着更加美观
    static Map<String, Express> expressMap = new TreeMap<>();//key为快递单号,value为快递信息

    //初始化快递柜,默认添加几个快递
    public ExpressDao() {
        expressMap.put("1001",new Express("1001","中通快递",123456,1,3));
        expressMap.put("1002",new Express("1002","圆通快递",456789,2,7));
        expressMap.put("1003",new Express("1003","顺丰速递",123789,6,2));
    }
    /**
     * 添加快递
     * @param express
     * @return express
     */
    public static Express add(Express express){
        Random random = new Random();
        if(expressMap.size() == 100){
            try {
                throw new Exception("快递柜已满!不能放入快递了!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        int x,y;
        do{
            x = random.nextInt(10);
            y = random.nextInt(10);
        }while(isExist(x,y));

        int code;
        do{
            code = random.nextInt(100000)+900000;
        }while(isExistCode(code));

        express.setCode(code);
        express.setX(x);
        express.setY(y);
        expressMap.put(express.getNumber(),express);
        return express;
    }
    /**
     * 判断快递柜是否已存在快递
     * @param x
     * @param y
     * @return true/false
     */
    public static boolean isExist(int x, int y){
        for(Express express : expressMap.values()){
            if(express.getX() == x && express.getY() == y){
                return true;
            }
        }
        return false;
    }
    /**
     * 判断取件码是否已经存在
     * @param code
     * @return true/false
     */
    public static boolean isExistCode(int code){
        for(Express express : expressMap.values()){
            if(express.getCode() == code){
                return true;
            }
        }
        return false;
    }
    /**
     * 根据快递单号查找快递,返回快递对象
     * @param number
     * @return express/null
     */
    public Express findExpressByNumber(String number){
        for(Express express : expressMap.values()){
            if(express.getNumber().equals(number)){
                return express;
            }
        }
        return null;
    }
    /**
     * 根据快递单号查找快递,如果不存在返回-1
     * @param number
     * @return 1/-1
     */
    public static int findExpressIsExist(String number){
        for(Express express:expressMap.values()){
            if(express.getNumber().equals(number)){
                return 1;
            }
        }
        return -1;
    }
    /**
     * 根据快递单号删除快递
     * @param number
     * @return true
     */
    public static boolean delete(String number) {
        expressMap.remove(number);
        return true;
    }
    /**
     * 修改快递信息
     * @param number
     * @param newExpress
     */
    public static void updateExpress(String number, Express newExpress) {
        Express oldExpress = expressMap.get(number);//获取旧的快递信息
        oldExpress.setCompany(newExpress.getCompany());
        oldExpress.setNumber(newExpress.getNumber());
    }
    /**
     * 获取所有的快递信息
     * @return expressMap
     */
    public Map<String, Express> getExpressMap(){
        return expressMap;
    }
    /**
     * 通过取件码查询是否存在
     * @param code
     * @return express/null
     */
    public static Express findByExpressCode(int code){
        Express e = new Express();
        e.setCode(code);
        for(Express express : expressMap.values()){
            if(express.getCode() == code){
                return express;
            }
        }
        return null;
    }
}

3. ExpressController类

//将同一包下的子包中的类导入进来,这三行代码需自行导包,不能直接复制

import mission.demo03.dao.ExpressDao;
import mission.demo03.express.Express;
import mission.demo03.view.ExpressView;

//调度逻辑的controller层
public class ExpressController {

    static ExpressView v = new ExpressView();
    static ExpressDao dao = new ExpressDao();

    //初始化界面
    public static void use() {
        //调用主菜单进入相应的使用者(用户or管理员)平台
        system:while(true){
            int mainNum = v.mainMenu();//调用主菜单
            switch(mainNum){
                case 0://结束使用
                    break system;
                case 1://进入管理员平台
                    try {
                        managerPlatform();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 2://进入用户平台
                    try {
                        userPlatform();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }
        v.bye();
    }
    //管理员操作界面
    public static void managerPlatform() {
        manager:while(true){
            int managerNum = v.managerMain();
            switch(managerNum){
                case 0:{//返回上一级页面
                    return;
                }
                case 1:{//1.录入快递
                    try {
                        insert();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break manager;
                case 2:{//2.删除快递
                    try {
                        delete();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break manager;
                case 3:{//3.修改快递
                    try {
                        update();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break manager;
                case 4:{//4.查看所有快递
                    printAll();
                }
                break manager;
            }
        }
    }
    //用户操作界面
    public static void userPlatform() {
        user:while(true){
            int userNum = v.userMain();
            switch(userNum){
                case 0:{//返回上一级页面
                    v.mainMenu();
                }
                break user;
                case 1:{//1.取出快递
                    int code = v.findByCode();
                    Express e = dao.findByExpressCode(code);
                    if(e == null){
                        v.noExist();
                    }else {
                        System.out.println("取件成功!");
                        v.printExpress(e);
                        v.printExpressLocation(e);
                        try {
                            dao.delete(e.getNumber());
                        } catch (Exception exception) {
                            exception.printStackTrace();
                        }
                    }
                }
                break user;
            }
        }
    }
    //录入快递
    public static void insert() {
        Express e1 = v.insertExpress();//输入快递信息
        Express e2 = dao.findExpressByNumber(e1.getNumber());//通过快递单号查询是否存在
        if (e2 == null){//此快递柜为空,add,生成取件码
            try {
                e2 = dao.add(e1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            v.printExpress(e2);//打印单条快递信息
            v.success();
        }else{
            v.hasExist();
        }
    }
    //删除快递
    public static void delete() {
        String num = v.findByNumber();//输入快递单号
        int exist = dao.findExpressIsExist(num);//查找快递是否存在
        if( exist == -1){//快递不存在
            v.noExist();
        }else {
            int deleteNum =v.isDeleteExpress();//确认是否进行删除操作
            if (deleteNum == 1){//确认删除
                try {
                    dao.delete(num);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("删除成功!");
            }else if (deleteNum == 0){//取消删除
                System.out.println("取消操作成功!");
            }
        }
    }
    //删除快递
    public static void update() {
        String num = v.findByNumber();//输入快递单号
        Express e1 = dao.findExpressByNumber(num);//通过快递单号查找快递,有则返回快递
        if( e1 == null){//快递不存在
            v.noExist();
        }else {
            String number = dao.findExpressByNumber(num).getNumber();//通过快递单号返回快递信息,获取number
            Express e2 = v.updateExpress();
            try {
                dao.updateExpress(number,e2);//修改快递信息
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("快递信息更新成功!");
            v.printExpress(e1);//输出单条快递信息
        }
    }
    //查看所有快递
    public static void printAll(){
        v.printAllExpress(dao.getExpressMap());
    }
}

4. Express类

//快递类
public class Express {

    private String number;
    private String company;
    private int code;
    private int x;//x坐标为快递所在的行数
    private int y;//y坐标为快递所在的列数

    public Express() {
    }

    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;
    }

    @Override
    public String toString() {
        return "快递信息[" +
                "快递单号:" + getNumber() + ' ' +
                ", 快递公司:" + getCompany() + ' ' +
                ", 取件码:" + getCode() + " , 在第" + (getX() + 1) + "行 第" + (getY() + 1) + "列柜子" +
                ']';
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

5. OutNumberBoundException类

//自定义异常类
public class OutNumberBoundException extends RuntimeException{
        public OutNumberBoundException(String s) {
            super(s);
        }
}

6. Main类

//将同一包下的子包中的类导入进来,此行代码需自行导包,不能直接复制

import mission.demo03.controller.ExpressController;

public class Main {
    public static void main(String[] args) {
        ExpressController e = new ExpressController();
        e.use();
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小成同学_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值