目錄
一,快遞管理訓練任務
描述
說明
dao層
view層
bean層
Main函數
代碼
Main
bean.Express
dao.ExpressDao
view.View
一,快遞管理訓練任務
描述
還記得之前的快遞管理嗎?學習了集合以後,使用集合來進行快遞資訊的 存儲吧。
說明
此任務卡與@&再見螢火蟲&【任務卡_02-面向對象_第6節 異常處理】基本内容相同,隻是在此基礎之上,使用HashMap進行改進,涉及到修改的地方如下:
dao層
1)屬性:
2)add方法
3)findByNumber方法
4)findByCode
同上
5)delete
6)findAll
view層
1)printAll
bean層
1)添加屬性
Main函數
部分資料類型可能對不上,根據提示修改就行。
代碼
項目結構如下:
:
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("快遞不存在,請檢查輸入");
}
}