IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 快递 E 栈系统03(数组+面向对象+集合) -> 正文阅读

[Java知识库]快递 E 栈系统03(数组+面向对象+集合)

写再前面:
1,本文为Java学习第五部分第一阶段所有项目回顾(快递e站部分-对应Java体系第一部分第三阶段-10-集合)
2,整体项目系列博客(包括整体快递e站系列)
3,完整的Java体系链接(比你想的更多的Java内容)

写在前面的话

10-集合那里我没有把练习作业写上,当然不止这一个练习作业。哪些作业在网盘里都有体现。

需求介绍:

在这里插入图片描述

涉及到的知识点:

上一版:
面向对象+异常处理
这一版:
面向对象+集合

代码运行成功截图:

查看所有快递

在这里插入图片描述

快递录入

在这里插入图片描述

快递删除

在这里插入图片描述

快递修改

在这里插入图片描述

用户取快递

在这里插入图片描述

思路分析:

毕竟用自己的思路讲一遍
上一版的流程图如下:(毕竟核心的逻辑就是那么回事)
在这里插入图片描述
这次把集合加进去了,流程倒是没什么大的改动,代码上加了一些细节的改变。
说一下和上一版相比的改动:
bean层:
快递实体类上加入了x,y坐标,意义是表示快递点里快递的位置。
dao层:
之前的二维数组分成了俩份,使用了一个布尔类型的数组表示快递点里快递的位置,HashMap代替二维数组表示快递柜(取件码和快递信息为键值对)。Collection集合存放所有的Express对象,size和random照旧。删除快递为移除键值对,坐标设置为false,size–。
view层:完善了打印快递信息方法,改善了遍历显示所有快递信息(原来是二维数组,现在是Collection集合)
main层:和原来一样。
exception和test类:和原来一样

代码:

bean层

package com.wyh.rewu.bean;
import java.util.Objects;

/**
 * 快递实体类
 */
public class Expresss {

    private String number; // 单号
    private String company; // 快递公司
    private int code; // 取件码

    // 坐标
    public Integer x;
    public Integer y;

    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 Integer getX() {
        return x;
    }

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

    public Integer getY() {
        return y;
    }

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

    public Expresss() {
    }

    public Expresss(String number, String company, int code, Integer x, Integer y) {
        this.number = number;
        this.company = company;
        this.code = code;
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString() {
        return "Expresss{" +
                "number='" + number + '\'' +
                ", company='" + company + '\'' +
                ", code=" + code +
                ", x=" + x +
                ", y=" + y +
                '}';
    }
}

dao层

package com.wyh.rewu.dao;

import com.wyh.rewu.bean.Expresss;
import java.util.*;

public class ExpressDao {

    boolean[][] cabinet = new boolean[10][];            // 二维数组表示快递柜
    HashMap<Integer, Expresss> data = new HashMap<>();   // HashMap代替二维数组表示快递柜
    Collection<Expresss> expressList = data.values();      // 存放所有的Express对象

    private int size=0; // 当前存储的快递数目(便于判断是否还有空位 否则在随机生成取件码时可能陷入死循环)
    private Random random = new Random();               // 用于生成随机数

    {
        for(int i = 0; i < 10; i++){
            cabinet[i] = new boolean[10];
        }
    }

    /*//**
     * 添加快递
     * @param e
     * @return
     */
    public boolean add(Expresss e){
        if(this.size >= 100){
            return false;
        }
        size++;// 添加一个快递,实际数量加一
        // 1,随机生成2个0-9的下标
        int x = -1;
        int y = -1;
        while (true){
            x = random.nextInt(10);
            y= random.nextInt(10);
            if (cabinet[x][y] == false){
                // 此位置无快递
                break;
            }
        }
        // 2,取件码
        int code = radomcode();
        e.setCode(code);
        e.x = x; // 快递柜存放快递的位置
        e.y = y;
        size++;   // 快递数目加一
        cabinet[x][y] = true;                           // 此位置已被占用
        data.put(code, e);                              // 添加键值对
        return true;
    }



    /*
     * 生成随机取件码(模板方法设计模式)
     * @return
     */
    public int radomcode(){
        while (true){
            int code = random.nextInt(900000)+100000;
            Expresss e = findBycode(code);
            if (e == null){
                return code;
            }
        }
    }

    /*
     * 根据单号查询快递
     * @param number
     * @return
     */
    public Expresss findByNumber(String number){
        // 遍历HashMap中的Express对象 找到其快递单号相对应的那个对象并返回
        for(Expresss e : expressList) {
            if(e.getNumber().equals(number)) {
                return e;
            }
        }
        return null;
    }

    /*
     * 根据取件码查询快递
     * @param code 取件码
     * @return
     */
    public Expresss findBycode(int code){
        for(Expresss e : expressList) {
            if(e.getCode() == code) {
                return e;
            }
        }
        return null;
    }

    /*
     * 修改快递
     * @param oldExpress
     * @param newExpress
     */
    public void update(Expresss oldExpress,Expresss newExpress){
        delete(oldExpress);
        add(newExpress);
    }

    /*
     * 删除快递
     * @param e
     */
    public void delete(Expresss e){
        data.remove(e.getCode());
        cabinet[e.x][e.y] = false;
        size--;
    }

    /**
     * 查询所有
     * @return
     */
    public Collection<Expresss> findAll(){
        return expressList;
    }
}

view层

package com.wyh.rewu.view;
import com.wyh.rewu.bean.Expresss;
import com.wyh.rewu.exception.OutNumberBoundException;
import java.util.Collection;
import java.util.Scanner;

/**
 * 视图层
 */
public class Views {

    private static Scanner input = new Scanner(System.in);

    /**
     * 欢迎方法
     */
    public void welcome() {
        System.out.println("欢迎来到开课吧快递管理系统");
    }

    /**
     * 再见方法
     */
    public void bye() {
        System.out.println("欢迎下次使用");
    }

    /**
     * 选择身份菜单
     *
     * @return
     */
    public static int menu() throws NumberFormatException, OutNumberBoundException {
        System.out.println("请先输入您的身份序号:\n"
                + "1,快递员\n"
                + "2,普通用户\n"
                + "0,退出");
        // 使用nextLine的优点 :不会因为输入产生冲突,还可以更好的接收各种类型的数据。
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.valueOf(text);  // 将字符串内容转为整数类型
            if (num < 0 || num > 2) {
                throw new OutNumberBoundException("数字范围0-2");
            }
            return num;
        } catch (NumberFormatException e) {
            throw new NumberFormatException("请按规则输入数字");
        }
    }

    /**
     * 快递员菜单界面
     * @return
     */
    public int cMenu() {
        System.out.println("请根据提示,输入功能序号:\n"
                + "1,快递录入\n"
                + "2,快递修改\n"
                + "3,快递删除\n"
                + "4,查看所有快递\n"
                + "0,退出\n"
        );
        String text = input.nextLine();
        int num = -1;
        try {
            // 将字符串内容转为整数类型
            num = Integer.parseInt(text);
        } catch (NumberFormatException e) {
            System.out.println("请按规则输入数字");
            return cMenu();
        }
        if (num < 0 || num > 4) {
            System.out.println("输入错误,请重新输入~");
            return cMenu();
        }
        return num;
    }

    /**
     * 用户菜单界面
     * @return
     */
    public int uMenu() throws OutNumberBoundException {
        System.out.println("请根据提示,进行取码");
        System.out.println("请输入您的取件码");
        String code = input.nextLine();
        int num = -1;
        try {
            // 将字符串内容转为整数类型
            num = Integer.parseInt(code);
        } catch (NumberFormatException e) {
            System.out.println("请按规则输入数字");
            return menu();
        }
        if (num < 100000 || num > 999999) {
            System.out.println("输入错误,请重新输入~");
            return menu();
        }
        return num;
    }

    /**
     * 快递录入
     * @return
     */
    public Expresss insert(){
        System.out.println("请根据提示,输入快递信息");
        System.out.println("请输入快递单号");
        String number = input.nextLine();
        System.out.println("请输入快递公司");
        String company = input.nextLine();
        Expresss e = new Expresss();
        e.setCompany(company);
        e.setNumber(number);
        return e;
    }

    /**
     * 快递修改
     * @return
     */
    public Expresss update(){
        System.out.println("请根据提示,输入快递信息");
        System.out.println("请输入要修改的快递单号");
        String number = input.nextLine();
        System.out.println("请输入快递公司");
        String company = input.nextLine();
        Expresss e = new Expresss();
        e.setCompany(company);
        e.setNumber(number);
        return e;
    }

    /**
     * 查找快递信息
     * @return
     */
    public String findByNumber(){
        System.out.println("请根据提示,输入快递信息");
        System.out.println("请输入要操作的快递单号");
        String number = input.nextLine();
        return number;
    }

    /**
     * 打印快递信息
     * @param e
     */
    public void printExpress(Expresss e){
        if(e == null){
            System.out.println("快递信息不存在");
            return;
        }
        System.out.println("快递信息如下");
        System.out.println("快递公司"+e.getCompany()+"快递单号"+e.getNumber()+"取件码"+e.getCode());
    }

    /**
     * 修改快递信息
     * @param e
     */
    public void update(Expresss e){
        System.out.println("请输入新的快递单号:");
        String number = input.nextLine();
        System.out.println("请输入新的快递公司:");
        String company = input.nextLine();
        e.setNumber(number);
        e.setCompany(company);
    }

    /**
     * 删除快递
     * @return 1,确认.2.取消
     */
    public int delete() throws OutNumberBoundException {
        System.out.println("是否确认删除:\n"
                + "1,确认删除\n"
                + "2,取消操作\n"
                + "0,退出\n"
        );
        String text = input.nextLine();
        int num = -1;
        try {
            // 将字符串内容转为整数类型
            num = Integer.parseInt(text);
        } catch (NumberFormatException e) {
            System.out.println("请按规则输入数字");
            return menu();
        }
        if (num < 0 || num > 2) {
            System.out.println("输入错误,请重新输入~");
            return menu();
        }
        return num;
    }

    /**
     * 遍历显示所有快递信息
     * @param es
     */
    public void printAll(Collection<Expresss> es){
        int count = 0;
        for(Expresss e : es) {
            count++;
            System.out.print("第" + (e.x + 1) + "排," + (e.y+ 1) + "列, ");
            printExpress(e);
        }
        if(count == 0){
            System.out.println("暂无快递信息");
        }
    }

    /**
     * 快递已经存在
     */
    public void expressExit() {
        System.out.println("此单号在快递中已经存在,请勿重复存储");
    }

    /**
     * 快递不存在
     */
    public void printNull(){
        System.out.println("快递不存在,请检查您的输入");
    }

    /**
     * 打印取件码
     * @param e
     */
    public void printCode(Expresss e){
            System.out.println("快递的取件码为: "+e.getCode());
    }

    /**
     *
     */
    public void success(){
        System.out.println("操作成功");
    }
}

main层

package com.wyh.rewu.main;

import com.wyh.rewu.bean.Expresss;
import com.wyh.rewu.dao.ExpressDao;
import com.wyh.rewu.exception.OutNumberBoundException;
import com.wyh.rewu.view.Views;
import java.util.Collection;

public class Main {
    // 初始化对象
    private static Views views = new Views();
    private static ExpressDao expressDao = new ExpressDao();

    public static void start() throws OutNumberBoundException {
        views.welcome(); // 欢迎
        m:while(true){
            try {
                // 弹出身份选择菜单
                int menu = views.menu();
                switch(menu){
                    case 0: // 退出
                        break m;
                    case 1: // 快递员
                        cClient();
                        break;
                    case 2: // 用户
                        uClient();
                        break;
                }
            }catch (OutNumberBoundException | NumberFormatException e){
                System.err.println(e.getMessage());
                start();
            }
        }
        views.bye();
    }

    /**
     * 快递员
     */
    private static void cClient() throws OutNumberBoundException {
        while(true){
            int menu = views.cMenu();
            switch(menu){
                case 0: // 退出
                    return;
                case 1: {// 快递录入
                    // 1,提示输入快递信息
                    Expresss e = views.insert();
                    // 2,此快递是否已经存在过
                    Expresss e2 = expressDao.findByNumber(e.getNumber());
                    // 3,存储快递
                    if (e2 == null) {
                        // 未存储过,存储
                        expressDao.add(e);
                        views.printExpress(e);
                    }else{
                        // 单号在快递中已存在
                        views.expressExit();
                    }
                }break;
                case 2: {// 快递修改
                    // 1,提示输入快递信息number
                    String number = views.findByNumber();
                    // 2,查找数据
                    Expresss e = expressDao.findByNumber(number);
                    // 3,打印快递信息
                    if (e == null) {
                        views.printNull();
                    }else{
                        views.printExpress(e);
                        // 4,提示修改
                        views.update(e);
                        expressDao.update(e,e);
                        views.printExpress(e);
                    }
                }break;
                case 3: {// 快递删除
                    // 1,提示输入快递单号
                    String number = views.findByNumber();
                    // 2,查找数据
                    Expresss e = expressDao.findByNumber(number);
                    // 3,打印快递信息
                    if (e == null) {
                        views.printNull();
                    }else{
                        views.printExpress(e);
                        // 4,删除
                        int type = views.delete();
                        if (type == 1){
                            expressDao.delete(e);
                            views.success();
                        }
                    }
                }break;
                case 4: {// 查看所有
                    Collection<Expresss> data = expressDao.findAll();   // 从dao层获取数据
                    views.printAll(data);               // 在视图层显示
                }break;
            }
        }
    }


    /**
     * 用户
     */
    private static void uClient() throws OutNumberBoundException {
        // 1,取件码获取
        int code = views.uMenu();
        // 2,根据取件码,取出快递
        Expresss e = expressDao.findBycode(code);
        if (e == null) {
            views.printNull();
        } else {
            views.success();
            views.printExpress(e);
        }
    }
}

其他:

test启动系统

package com.wyh.rewu;

import com.wyh.rewu.exception.OutNumberBoundException;
import com.wyh.rewu.main.Main;

public class text {
    public static void main(String[] args) throws OutNumberBoundException {
        Main main = new Main();
        main.start();
    }
}

exception异常类

package com.wyh.rewu.exception;

/**
 * 自定义异常类,数字超出规定范围
 */
public class OutNumberBoundException extends Throwable {
    public OutNumberBoundException(String s) {
        super(s);
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:26:08  更:2022-02-22 20:28:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:33:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码