天天看點

任務卡_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("快遞不存在,請檢查輸入");
    }

}