天天看点

任务卡_03-Java核心类库_第3节 集合

目录

​​一,快递管理训练任务​​

​​描述​​

​​说明​​

​​dao层​​

​​view层​​

​​bean层​​

​​Main函数​​

​​代码​​

​​Main​​

​​bean.Express​​

​​dao.ExpressDao​​

​​view.View​​

一,快递管理训练任务

描述

还记得之前的快递管理吗?学习了集合以后,使用集合来进行快递信息的 存储吧。
任务卡_03-Java核心类库_第3节 集合

说明

此任务卡与​​@&再见萤火虫&【任务卡_02-面向对象_第6节 异常处理】​​基本内容相同,只是在此基础之上,使用HashMap进行改进,涉及到修改的地方如下:

dao层

1)属性:

任务卡_03-Java核心类库_第3节 集合

2)add方法

任务卡_03-Java核心类库_第3节 集合

3)findByNumber方法

任务卡_03-Java核心类库_第3节 集合

4)findByCode

同上

5)delete

任务卡_03-Java核心类库_第3节 集合

6)findAll

任务卡_03-Java核心类库_第3节 集合

view层

1)printAll

任务卡_03-Java核心类库_第3节 集合

bean层

1)添加属性

任务卡_03-Java核心类库_第3节 集合

Main函数

部分数据类型可能对不上,根据提示修改就行。

代码

项目结构如下:

任务卡_03-Java核心类库_第3节 集合

:

Main

package main;

import bean.Express;
import dao.ExpressDao;
import view.View;

import java.util.Collection;

public class Main {
    // 初始化视图对象
    private static View v = new View(); // 这样可以跨方法使用
    // 初始化dao对象
    private static ExpressDao dao = new ExpressDao();
    // 1,弹出身份选择菜单
    public static void main(String[] args) {

        m:while (true){
            int menu = v.menu();
            switch (menu){
                case 0:
                    break m;
                case 1:
                    gClient();
                    break;
                case 2:
                    uClient();
                    break;
            }
        }

    }

    private static void uClient() {
        // 1,获得取件码
        int code = v.uMenu();
        // 2,根据取件码取出快递
        Express e = dao.findByCode(code);
        if(e == null){
            v.printNull();
        }else {
            v.success();
            v.printExpress(e);
            dao.delete(e);
        }
    }

    private static void gClient() {
        while (true){
            int menu = v.gMenu();
            switch (menu){
                case 0:
                    return;
                case 1:{
                    // 1,提示输入快递信息
                    Express e = v.insert();
                    // 2,此快递是否已经存储过
                    Express e2 = dao.findByNumber(e.getNumber());
                    // 3,存储快递
                    if(e2 == null){                 // 未存储过
                        dao.add(e);
                        v.printCode(e);
                    }else {                         // 单号重复
                        v.expressExist();
                    }
                    break;
                }
                case 2: {// 快递修改
                    // 1,提示输入快递信息
                    String number = v.findByNumber();
                    // 2,查找数据
                    Express e1 = dao.findByNumber(number);
                    // 3,打印快递信息
                    if(e1 == null){
                        v.printNull();
                    }else {
                        v.printExpress(e1);
                        // 4,提示修改
                        v.update(e1);               // 这里已经将快递的信息修改过了
                        dao.update(e1, e1);         // 这里只是为了强调 删除-修改的过程
                        v.printExpress(e1);
                    }

                    break;
                }
                case 3: {// 删除
                    // 1,输入快递单号
                    String number = v.findByNumber();
                    // 2,查找快递对象
                    Express e = dao.findByNumber(number);
                    if(e == null){
                        v.printNull();
                    }else {
                        v.printExpress(e);
                        int type = v.delete();
                        if(type == 1){
                            dao.delete(e);
                        }else {
                            v.success();
                        }
                    }
                    break;
                }
                case 4:{    // 查看所有
                    Collection<Express> data = dao.findAll();   // 从dao层获取数据
                    v.printAll(data);               // 在视图层显示
                    break;
                }
            }
        }
    }
}      

bean.Express

package bean;

import java.util.Objects;

/**
 *
 */
public class Express {
    private String number;  // 快递单号
    private String company; // 公司
    private int code;       // 取件码
    public int posX, posY;  // 快递所在快递柜中的位置

    // 构造方法
    public Express(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

    public Express() {
    }

    // getter/setter

    public String getNumber() {
        return number;
    }

    public String getCompany() {
        return company;
    }

    public int getCode() {
        return code;
    }

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

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

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

    // 重写toString 方法

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

    // 重写equals方法

    /**
     * 只要快递单号相同就认为快递相同
     * @param o
     * @return
     */
    @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(number, express.number);
    }

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

dao.ExpressDao

package dao;

import bean.Express;

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

public class ExpressDao {
    boolean[][] cabinet = new boolean[10][];            // 二维数组表示快递柜
    HashMap<Integer, Express> data = new HashMap<>();   // HashMap代替二维数组表示快递柜
    Collection<Express> expresses = data.values();      // 存放所有的Express对象
    {
        for(int i = 0; i < 10; i++){
            cabinet[i] = new boolean[10];
        }
    }
    private Random random = new Random();               // 用于生成随机数
    private int size;   // 当前存储的快递数目(便于判断是否还有空位 否则在随机生成取件码时可能陷入死循环)

    /**
     * 用于存储快递
     * @param e
     * @return
     */
    public boolean add(Express e){
        if(this.size >= 100){
            return false;
        }
        // 1,随机生成两个0-9的下标
        int x = -1, y = -1;
        while (true){
            x = random.nextInt(10);
            y = random.nextInt(10);
            if(cabinet[x][y] == false){
                break;                                  // 此位置未被占用
            }
        }
        // 2,判断取件码是否重复(最简单的 一个个对比)
        int code = randomCode();                        // 获得没有重复的取件码
        e.setCode(code);
        e.posX = x;                                     // 快递柜存放快递的位置
        e.posY = y;
        size++;                                         // 快递数目加一
        cabinet[x][y] = true;                           // 此位置已被占用
        data.put(code, e);                              // 添加键值对
        return true;

    }
    private int randomCode(){
        while (true) {
            int code = random.nextInt(900000) + 100000; // 范围(000000-899999)+1000000
            Express e = findByCode(code);
            if(e == null) { // 说明取件码未重复
                return code;
            }
        }

    }

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

    /**
     * 根据取件码查询快递
     * @param code 取件码
     * @return 查询到结果 查询失败返回null
     */
    public Express findByCode(int code){
        for(Express e : expresses) {
            if(e.getCode() == code) {
                return e;
            }
        }
        return null;
    }

    /**
     * 多余的操作 为了MVC更圆润
     * @param oldExpress
     * @param newExpress
     */
    public void update(Express oldExpress, Express newExpress){
        delete(oldExpress);
        add(newExpress);
    }
    public void delete(Express e){
        data.remove(e.getCode());
        cabinet[e.posX][e.posY] = false;
        size--;
    }
    public Collection<Express> findAll(){
        return expresses;
    }
}      

view.View

package view;

import bean.Express;

import java.util.Collection;
import java.util.Scanner;

/**
 * 视图层
 * 只负责展示视图 不包含其他任何逻辑
 */
public class View {
    public Scanner input = new Scanner(System.in);

    /**
     * 获得用户的角色选择输入,并进入相应的功能
     * @return 返回功能码 1:管理原 2:普通用户 0:退出
     */
    public int menu(){
        System.out.println("根据提示输入功能序号:");
        System.out.println("1,管理员");
        System.out.println("2,普通用户");
        System.out.println("0,退出");
        String s = input.nextLine();
        int funcNum = -1;
        try{
            funcNum = Integer.parseInt(s);
        }catch (NumberFormatException e){   // 格式异常 递归继续获取功能码
            return menu();
        }
        if(funcNum < 0 || funcNum > 2){     // 功能码不合法
            return menu();
        }
        return funcNum;
    }

    /*
    -----------------------------------------------------------------
     */

    /**
     * 获得管理员输入的功能码
     * @return 管理员输入的合法功能码 1:录入 2:修改 3:删除 4:查看所有 0:退出
     */
    public int gMenu(){
        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();
        int funcNum = -1;
        try{
            funcNum = Integer.parseInt(s);
        }catch (NumberFormatException e){   // 格式异常 递归继续获取功能码
            return gMenu();
        }
        if(funcNum < 0 || funcNum > 4){     // 功能码不合法
            return gMenu();
        }
        return funcNum;
    }

    /**
     * 1快递员录入信息
     * @return 返回包含了快递单号和快递公司的快递对象
     */
    public Express insert(){
        System.out.println("请根据提示输入快递信息:");
        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;
    }

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

    /**
     * 3询问是否删除
     * @return 给出快递管理员的选择 1:删除 2:取消
     */
    public int delete(){
        System.out.println("确认是否删除:");
        System.out.println("1,确认删除");
        System.out.println("2,取消删除");
        System.out.println("0,退出");
        String s = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(s);
        }catch (NumberFormatException e){
            return delete();
        }
        if(num < 0 || num > 2){
            return delete();
        }
        return num;
    }

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

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

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


    /*
    -----------------------------------------------------------------
     */

    /**
     * 获得用户输入的取件码(这里简化,只要取件码相同,就算取件成功)
     * @return 用户输入的合法功能码(6位)
     */
    public int uMenu(){
        System.out.println("根据提示进行取件:");
        System.out.print("请输入取件码:");
        String s = input.nextLine();
        int funcNum = -1;
        try{
            funcNum = Integer.parseInt(s);
        }catch (NumberFormatException e){   // 格式异常 递归继续获取功能码
            return uMenu();
        }
        if(funcNum < 100000 || funcNum > 999999){     // 功能码不合法
            System.out.println("输入有误,请重试!");
            return uMenu();
        }
        return funcNum;
    }

    public void expressExist(){
        System.out.println("此快递单号已存在,请勿重复存储");
    }
    public void printCode(Express e) {
        System.out.println("新快递的取件码为:" + e.getCode());
    }

    public void success(){
        System.out.println("操作成功!");
    }
    public void printNull(){
        System.out.println("快递不存在,请检查输入");
    }

}