快递管理训练(IO)

任务概述:

采用二维数组存储快递,使用IO技术将快递数据存储到文件中,可以在每次启动应用时读取文件中的内容。

1、管理员

        - 快递录入

                - 柜子位置(系统产生,不能重复)

                - 快递单号(输入)

                - 快递公司(输入)

                - 6位取件码(系统 产生,不能重复)

- 根据单号删除快递

- 根据单号修改快递

- 查看所有快递(遍历)

2、普通用户

- 快递取出

        - 输入取件码:显示快递的信息和在哪个柜子中,从柜子中移除这个快递信息

代码部分:

目录结构:

bean => Express

package pers.h.express.bean;

import java.io.Serializable;
import java.util.Objects;

/**
 * @author s
 * @version 1.0
 * @date 2022-02-07
 */
public class Express implements Serializable {
    // 快递单号
    private String number;
    // 快递公司
    private String company;
    // 取件码
    private int code;
    // 快递位置
    public int posX;
    public int posY;
    // 无参构造函数
    public Express() {
    }
    // 全参构造函数
    public Express(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

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

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

    @Override
    // 重写equals方法,快递单号相同,则快递相同
    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(number,express);
    }

    @Override
    public int hashCode() {
        return Objects.hash(code);
    }
}

dao => ExpressDao

package pers.h.express.dao;

import pers.h.express.bean.Express;

import java.util.Collection;
import java.util.HashMap;
import java.util.Random;

/**
 * @author s
 * @version 1.0
 * @date 2022-02-07
 */
public class ExpressDao {
    // 生产随机数
    private Random random = new Random();
    //存快递
    public boolean add(Express e, boolean[][] cabinet, HashMap<Integer,Express> data){
        int size = data.size();
        // 判断快递是否存满
        if(size >= 100){
            return false;
        }
        // 生产随机下标
        int x = -1, y = -1;
        while (true){
            x = random.nextInt(10);
            y = random.nextInt(10);
            if(cabinet[x][y] == false){
                break; // 此位置为空,跳出循环
            }
        }
        int code = randomCode(data.values());//获得未重复的取件码
        e.setCode(code);
        e.posX = x;
        e.posY = y;
        size++;
        cabinet[x][y] = true;
        data.put(code,e);
        return true;
    }
    /**
     * @Description 遍历所有对象,生产取件码
     * @param expresses
     * @return int
     */
    private int randomCode(Collection<Express> expresses){
        while (true){
            int code = random.nextInt(900000) + 100000;
            Express e = findByCode(code,expresses);
            if(e == null){
                return code;
            }
        }
    }

    public Express findByCode(int code,Collection<Express> expresses){
        for(Express e: expresses){
            if(e.getCode() == code){
                return e;
            }
        }
        return null;
    }

    public Express findByNumber(String number,Collection<Express> expresses){
        for(Express e: expresses){
            if(e.getNumber().equals(number)){
                return e;
            }
        }
        return null;
    }

    public void update(Express oldExpress, Express newExpress, boolean[][] cabinet, HashMap<Integer,Express> data){
        delete(oldExpress,cabinet,data);
        add(newExpress,cabinet,data);
    }

    public void delete(Express e,boolean[][] cabinet,HashMap<Integer,Express> data){
        data.remove(e.getCode());
        cabinet[e.posX][e.posY] = false;
    }
}


main => Main

package pers.h.express.main;

import pers.h.express.bean.Express;
import pers.h.express.dao.ExpressDao;
import pers.h.express.view.Views;

import java.io.*;
import java.util.Collection;
import java.util.HashMap;

/**
 * @author s
 * @version 1.0
 * @date 2022-02-07
 */
public class Main {
    private static Views v = new Views();
    private static ExpressDao dao = new ExpressDao();
    // 程序入口
    public  static void main(String[] args) throws IOException,ClassNotFoundException {
        // 初始化数据结构
        boolean[][] cabinet = new boolean[10][]; //二维数组表示快递柜
        HashMap<Integer, Express> data; // HashMap代替二维数组表示快递柜
        Collection<Express> expresses; // 存放所有快递信息
        for(int i = 0; i < 10; i++){
            cabinet[i] = new boolean[10];
        }
        int size = 0; //当前快递的存储数目(便于判断快递柜是否还有空位置)
        // 反序列化获得快递柜中存储的对象HashMap<Integer,Express> data
        try(FileInputStream fis = new FileInputStream("Expresses.txt")){
            ObjectInputStream ois = new ObjectInputStream(fis);
            data = (HashMap<Integer, Express>) ois.readObject();
            ois.close();
        }catch (IOException e){
            data = new HashMap<>();
        }
        expresses = data.values();
        for(Express e:expresses){
            cabinet[e.posX][e.posY] = true;
        }
        m:
        while(true){
            int menu = v.menuMain();
            switch (menu){
                case 0:
                    break m;
                case 1:
                    gClient(data.size(),cabinet,data);
                    break;
                case 2:
                    uClinet(data.size(),cabinet,data);
                    break;
            }
        }
        FileOutputStream fos = new FileOutputStream("Expresses.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(data);
        oos.close();
    }
    private static void uClinet(int size, boolean[][] cabinet,HashMap<Integer,Express> data){
        Collection<Express> expresses = data.values(); // 获得所有快递对象,便于遍历查找
        // 1.获取取件码
        int code = v.uMenu();
        // 2.根据取件码取出快递
        Express e = dao.findByCode(code,expresses);
        if(e == null){
            v.printNull();
        }else {
            v.success();
            v.printExpress(e);
            dao.delete(e, cabinet, data);
        }
    }
    private static void gClient(int size, boolean[][] cabinet, HashMap<Integer, Express> data){
        while (true){
            int menu = v.menuDeliveryMan();
            switch (menu){
                case 0:
                    return;
                case 1:{
                    // 1、提示输入快递信息
                    Express e = v.insert();
                    // 2、此快递是否已经存储过
                    Express e2 = dao.findByNumber(e.getNumber(),data.values());
                    // 3、存储快递
                    if(e2 == null){ // 未存储过
                        dao.add(e,cabinet,data);
//                        v.printCode(e);
                    }else{
                        v.expressExist();
                    }
                    break;
                }
                case 2:{ //修改快递
                    // 1、提示输入快递信息
                    String number = v.findByNumber();
                    // 2、查找数据
                    Express e1 = dao.findByNumber(number, data.values());
                    // 3、打印快递信息
                    if(e1 == null){
                        v.printNull();
                    }else{
                        v.printExpress(e1);
                        // 4、提示修改
                        v.update(e1);
                        dao.update(e1,e1,cabinet,data);
                        v.printExpress(e1);
                    }
                    break;
                }
                case 3: {// 删除
                    // 1、输入快递单号
                    String number = v.findByNumber();
                    // 2、查找快递对象
                    Express e = dao.findByNumber(number,data.values());
                    if(e == null){
                        v.printNull();
                    }else{
                        v.printExpress(e);
                        int type = v.delete();
                        if(type == 1){
                            dao.delete(e,cabinet,data);
                        }else{
                            v.success();
                        }
                    }
                    break;
                }
                case 4:{ //查看所有
                    v.printAll(data.values());
                    break;
                }
            }
        }
    }
}

view => views

package pers.h.express.view;

import pers.h.express.bean.Express;

import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Scanner;

/**
 * @author s
 * @version 1.0
 * @date 2022-02-07
 */
public class Views {
    private Scanner sc = new Scanner(System.in);

    public void welcome(){
        System.out.println("=========欢迎使用新职课快递柜=========");
    }

    public void exit(){
        System.out.println("==========欢迎下次使用!==========");
    }

    /**
     * 选择身份界面
     * @return
     * */
    public int menuMain(){
        System.out.println("请输入您的身份:1-快递员;2-用户;0-退出");
        String inp = sc.nextLine();
        int num = -1;
        // 判断用户输入是否正确
        try {
            num = Integer.parseInt(inp);
        }catch (NumberFormatException e){

        }
        if(num < 0 || num > 2){
            System.out.println("您的输入有误,请重新输入!");
            return menuMain();
        }
        return num;
    }

    /**
     * 快递员功能界面
     * @return
     * */
    public int menuDeliveryMan(){
        System.out.println("请输入:1-快递录入;2-快递修改;3-快递删除;4-查看所有快递;0-返回上级目录");
        String inp = sc.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(inp);
        }catch (NumberFormatException e){

        }
        if(num < 0 || num > 5){
            System.out.println("输入有误,请重新输入!");
            return menuDeliveryMan();
        }
        return num;
    }

    /**
     * 快递员录入快递
     * @return
     * */
    public Express insert(){
        System.out.println("请输入快递单号:");
        String number = sc.nextLine();
        System.out.println("请输入快递公司:");
        String company = sc.nextLine();
        Express express = new Express();
        express.setNumber(number);
        express.setCompany(company);
        return express;
    }

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

    /**
     * 询问是否删除
     * @return 1-确认删除;2-取消并退出
     * */
    public int delete(){
        System.out.println("确认删除么?1-确认删除;2-取消;0-退出");
        String inp = sc.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(inp);
        }catch (NumberFormatException e){
            return delete();
        }
        if(num < 0 || num > 2){
            return delete();
        }
        return num;
    }

    /**
     * 显示所有快递信息
     * @param expresses
     * */
    public void printAll(Collection<Express> expresses){
        int count = 0;
        for(Express e : expresses){
            count++;
            System.out.println("第"+(e.posX)+"行,第"+(e.posY+1)+"列,"+e);
        }
    }

    /**
     * 打印快递信息
     * @param express
     * */
    public void printExpress(Express express){
        System.out.println(express.toString());
    }

    /**
     *输入快递单号,用于查找快递
     * @return number
     * */
    public String findByNumber(){
        System.out.println("请输入快递单号:");
        String number = sc.nextLine();
        return number;
    }

    /**
     * 用户菜单界面
     * @return
     * */
    public int uMenu(){
        System.out.println("请输入取件码");
        String code = sc.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(code);
        }catch (NumberFormatException e){
            System.out.println("您的输入有误,请重新输入!");
            return uMenu();
        }
        if(num < 100000 || num > 999999){
            System.out.println("输入有误,请重新输入!");
            return uMenu();
        }
        return num;
    }

    /**
     * 快递已存在
     * */
    public void expressExist(){
        System.out.println("此单号在快递柜中已存在,请检查是否正确!");
    }

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

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


    /**
     * 提示快递柜不存在
     * */
    public void printNull(){
        System.out.println("快递不存在,请检查输入是否正确!");
    }

    /**
     * 操作失败
     * */

    public void printFail(){
        System.out.println("操作失败!");
    }
    public void isNull(){
        System.out.println("无快递信息!");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值