Javaの集合HashMap写快递管理系统v2.0

一 任务概述

1,管理员:
- 快递录入
- 快递位置 (随机,不能重复)
- 快递单号 (输入)
- 快递公司 (输入)
- 6位取件码 (随机,不能重复)
- 快递删除 (根据单号)
- 快递修改 (根据单号)
- 查看所有快递 (遍历)

2,普通用户
- 快递取出
- 输入取件码,显示快递信息和在哪个柜子,从柜子中移除快递

二 复习

1 集合的分类、特点与区别

数组集合
长度固定可变
存储类型同类型类型可不一致
存储单元元素对象
使用场景对象多时

数组存在的问题:元素的个数固定(不能扩容)、不利于插入。

集合: java 对数据结构(数组、栈、队列、链表和红黑树等)的实现。

类集中最大的几个操作接口:Collection、Map、Iterator,这三个接口为要使用的最重点的接口。

CollectionMap
单列集合,单值存储双列集合,对值存储
CollectionCollectionCollectionCollection
ListListSetSet
元素有序,元素可重复元素有序,元素可重复元素无序,且不可重复元素无序,且不可重复
ArrayListLinkedListHashSetTreeSet
数据存储的结构是数组结构链表结构(可当做栈、队列使用)链表和哈希表组合的数据存储结构
元素增删慢,查找快方便元素增删(首尾方法)散列无序地存储有序地二叉树存储(自然顺序)

Map:

HashMapHashTable,结果一样,散列存放;

ConcurrentHashMap,结果一样但与HashMap顺序不同;

TreeMap,会自动排序;

LinkedHashMap,使用HashMap还能保证存储顺序,既在HashMap中又在双向链表中。

鉴于(1)快递的单号、取件码、存货位置不可重复(排除List类),(2)一码一货(key -> value),选择使用HashMap(对值存储)。

2 常用函数或方法

//  对象的get函数
    e.getX()、e.getY()、e.getCompany、e.getNumber()、e.getCode()
    private static Map<String, Express> expressMap = new HashMap<>();
    
    // 判断key->的快递是否为空
    expressMap.get(code) != null
    expressMap.get(oldExpressNumber) == null             

    //  map.put("key1", "value1")
    expressMap.put(number, e);

    // map.getKey()、map.getValue()
                                          
    // 移除 map.remove(number)
    expressMap.remove(oldExpressNumber);                 
    expressMap.remove(expressMap.get(delExpressNumber).getCode());
    expressMap.remove(expressMap.get(delExpressNumber).getX());
    expressMap.remove(expressMap.get(delExpressNumber).getY());
                           
    // 遍历keySet()输出
    for (String number : expressMap.keySet()) {
         Express e = expressMap.get(number);
         System.out.println("···");
     }
                   
    // 根据取件码找对象              
     if (expressMap.get(number).getCode() == code ){
        String s = number;
        Express e = expressMap.get(s);
        System.out.println("···");
    }
              
  

三 任务拆解

1 创建快递对象

public class Express {

    private String number;    // 快递单号
    private String company;   // 快递公司
    private int code;         // 取件码
    private int x;            // 快递箱排数
    private int y;            // 快递箱列数

}

创建get、set、equals、toString、有参等;

2 快递界面及部分通用功能

(1)欢迎语、再见语

(2)选择身份菜单(判断输入参数要合理)
考察点:字符串转数字Integer.parseInt(text)、异常处理NumberFormatException、返回数据类型

(3) 快递员浏览的菜单、用户浏览的菜单(判断输入参数要合理)
考察点:同上

(4)是否删除界面(判断输入参数要合理)
考察点:同上

(5)快递不存在、已存在的提示语

3 主程序

(1)case选择

 m:while (true) {
            int menu = v.menu();     
            switch (menu) {
                case 0:               // 退出
                    v.bye();
                    break m;
                case 1:               // 快递员
                    cClient();
                    break;
                case 2:               // 普通用户
                    uClient();
                    break;
            }
     while (true) {
            int menu = v.cMenu();
            switch (menu) {
                case 0:
                    return;
                case 1:{               // 快递录入
                    System.out.println("请根据提示,输入快递信息:");
                    System.out.println("请输入快递公司:");
                    String company = input.nextLine();
                    System.out.println("请输入快递单号:");
                    String number = input.nextLine();
                    // 内容
                    }
                    break;

                case 2: {               // 快递修改
                    System.out.println("请输入要修改的快递单号:");
                    String oldExpressNumber = input.nextLine();
                    // 内容
                    }
                    break;

                case 3 : {               // 快递删除
                    System.out.print("请输入要删除的快递单号:");
                    String delExpressNumber = input.nextLine();
                    // 内容
                    }
                    break;

                case 4 :{               // 查看所有快递
                    // 内容
                    }
                    break;
                }
     }

(2)生成相互联系的快递(信息)

        // 生成 不重复 的六位数取货码
        int code = 0;
        do{
            code = random.nextInt(900000)+100000;
        }while(expressMap.get(code) != null);  // Hashmap保证不重复

        // 生成 不重复 的快递位置
        int x = -1;
        int y = -1;
        do{
            x = random.nextInt(10);
            y = random.nextInt(10);
        }while(expressMap.get(x) != null && expressMap.get(y) != null);

       // 创建一个快递对象
       Express e = new Express(number,company,code,x,y);  
       expressMap.put(number, e);
       System.out.println("快递存储成功!");
       System.out.println("快递存放在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列。快递信息: " +
                         "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
                         "取件码为【" + e.getCode() + "】。");

(3)修改快递信息

只更换number,不更换code、x、y。

      int code = expressMap.get(oldExpressNumber).getCode();
      int x = expressMap.get(oldExpressNumber).getX();
      int y = expressMap.get(oldExpressNumber).getY();
      Express e = new Express(newExpressNumber,company,code,x,y);
      expressMap.remove(oldExpressNumber);
      expressMap.put(newExpressNumber, e);
      System.out.println("快递信息修改成功!");
      System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
                        "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
                        "取件码为【" + e.getCode() + "】。");

(4)删除快递信息

删除code、x、y,以便新增快递。

expressMap.remove(expressMap.get(delExpressNumber).getCode());
expressMap.remove(expressMap.get(delExpressNumber).getX());
expressMap.remove(expressMap.get(delExpressNumber).getY());
expressMap.remove(delExpressNumber);
System.out.println("快递删除成功!");

(5)删除快递信息

for (String number : expressMap.keySet()) {
          Express e = expressMap.get(number);
          System.out.println("···");
}

(6)用户根据code查取快递

       
        for (String number : expressMap.keySet()) {
            // 单号存在
            if (expressMap.get(number).getCode() == code ){
                String s = number;
                Express e = expressMap.get(s);
                System.out.println("快递在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列");
                // 用户取件后
                System.out.println("取货成功!");
                expressMap.remove(e.getCode());
                expressMap.remove(e.getX());
                expressMap.remove(e.getY());
                expressMap.remove(e.getNumber());
            }
       }    

为了判断“快递不存在”,加入已存快递计数器count。

        int temp = 0;
        
        for (String number : expressMap.keySet()) {
            temp ++ ;
            // 单号存在
            // 略
            // 单号不存在
            } else if (count == temp ){
                v.printNull();
           }
      }

四 完整代码

1 快递信息对象

import java.util.Objects;

public class Express {
    private String number;    // 快递单号
    private String company;   // 快递公司
    private int code;         // 取件码
    private int x;            // 快递箱排数
    private int y;            // 快递箱列数


    public Express(String number) {
        this.number = number;
    }

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

    public String getNumber() {
        return number;
    }

    public String getCompany() {
        return company;
    }

    public int getCode() {
        return code;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

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

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

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

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

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Express express = (Express) o;
        return code == express.code &&
                x == express.x &&
                y == express.y &&
                Objects.equals(number, express.number) &&
                Objects.equals(company, express.company);
    }

    @Override
    public int hashCode() {
        return Objects.hash(number, company, code, x, y);
    }

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

2 快递界面及部分通用功能

import java.util.Scanner;


public class View {

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

    /*
    欢迎与再见
     */
    public void welcome() {
        System.out.println("欢迎使用XXX快递管理系统!");
    }
    public void bye() {
        System.out.println("欢迎下次使用!");
    }

    /*
    选择身份的菜单
     */
    public int menu() {
        System.out.println("请根据提示,输入功能序号:");
        System.out.println("1.快递员");
        System.out.println("2.普通用户");
        System.out.println("0.退出");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        }catch(NumberFormatException e) {

        }
        if ( num < 0 || num > 2 ) {
            System.out.println("输入错误,请重新输入:");
            return menu();
        }
        return num;


    }

    /*
    快递员浏览的菜单
     */

    public int cMenu(){
        System.out.println("请根据提示,输入功能序号:");
        System.out.println("1.快递录入");
        System.out.println("2.快递修改");
        System.out.println("3.快递删除");
        System.out.println("4.查看所有快递");
        System.out.println("0.返回上级目录");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        }catch(NumberFormatException e) {

        }
        if ( num < 0 || num > 4 ) {
            System.out.println("输入错误,请重新输入:");
            return cMenu();
        }
        return num;
    }



    /*
    用户浏览的菜单
     */
    public int uMenu(){
        System.out.println("请根据提示,进行取件:");
        System.out.println("请输入您的取件码:");
        String code = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(code);
        }catch(NumberFormatException e) {

        }
        if ( num < 100000 || num > 999999 ) {
            System.out.println("输入错误,请重新输入:");
            return uMenu();
        }
        return num;
    }


    /*询问是否删除*/
    public int delete() {
        System.out.println("是否确认删除:");
        System.out.println("1.确认删除");
        System.out.println("2.取消删除");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        }catch(NumberFormatException e) {

        }
        if ( num < 0 || num > 2 ) {
            System.out.println("输入错误,请重新输入:");
            return delete();
        }
        return num;
    }

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

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



}

3 主程序代码

import java.util.*;

public class main {
    private static View v = new View();
    private static Map<String, Express> expressMap = new HashMap<>();
    private static Scanner input = new Scanner(System.in);
    private static Random random = new Random();
    private static int count;

    public static void main(String[] args) {

        v.welcome();

        /*  身份选择菜单
            System.out.println("请根据提示,输入功能序号:");
            System.out.println("1.快递员");
            System.out.println("2.普通用户");
            System.out.println("0.退出");
         */
        m:while (true) {
            int menu = v.menu();      
            switch (menu) {
                case 0:               // 退出
                    v.bye();
                    break m;
                case 1:               // 快递员
                    cClient();
                    break;
                case 2:               // 普通用户
                    uClient();
                    break;
            }
        }

    }

    /*  快递员菜单
        System.out.println("请根据提示,输入功能序号:");
        System.out.println("1.快递录入");
        System.out.println("2.快递修改");
        System.out.println("3.快递删除");
        System.out.println("4.查看所有快递");
        System.out.println("0.返回上级目录");
     */
    private static void cClient() {
       while (true) {
            int menu = v.cMenu();
            switch (menu) {
                case 0:
                    return;
                case 1:{               // 快递录入
                    System.out.println("请根据提示,输入快递信息:");
                    System.out.println("请输入快递公司:");
                    String company = input.nextLine();
                    System.out.println("请输入快递单号:");
                    String number = input.nextLine();
                    if (expressMap.get(number) != null) {
                        v.expressExit();
                    } else {
                        // 生成 不重复 的六位数取货码
                        int code = 0;
                        do{
                            code = random.nextInt(900000)+100000;
                        }while(expressMap.get(code) != null);

                        // 生成 不重复 的快递位置
                        int x = -1;
                        int y = -1;
                        do{
                            x = random.nextInt(10);
                            y = random.nextInt(10);
                        }while(expressMap.get(x) != null && expressMap.get(y) != null);
                        Express e = new Express(number,company,code,x,y);
                        expressMap.put(number, e);
                        System.out.println("快递存储成功!");
                        System.out.println("快递存放在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列。快递信息: " +
                                "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
                                "取件码为【" + e.getCode() + "】。");
                        count++;
                        // System.out.println("当前快递存储数为:"+count);
                    }
                }
                break;

                case 2: {               // 快递修改
                    System.out.println("请输入要修改的快递单号:");
                    String oldExpressNumber = input.nextLine();
                    if (expressMap.get(oldExpressNumber) == null) {
                        v.printNull();
                    } else {
                        System.out.println("请输入新的快递信息:");
                        System.out.println("请输入快递公司:");
                        String company = input.nextLine();
                        System.out.print("请输入新的快递单号:");
                        String newExpressNumber = input.nextLine();
                        int code = expressMap.get(oldExpressNumber).getCode();
                        int x = expressMap.get(oldExpressNumber).getX();
                        int y = expressMap.get(oldExpressNumber).getY();
                        Express e = new Express(newExpressNumber,company,code,x,y);
                        expressMap.remove(oldExpressNumber);
                        expressMap.put(newExpressNumber, e);
                        System.out.println("快递信息修改成功!");
                        System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
                                "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
                                "取件码为【" + e.getCode() + "】。");
                        }
                    }
                break;

                case 3 : {               // 快递删除
                    System.out.print("请输入要删除的快递单号:");
                    String delExpressNumber = input.nextLine();
                    if (expressMap.get(delExpressNumber) == null) {
                        v.printNull();
                    } else {
                        int type = v.delete();
                        if (type == 1) {
                            // 取货码  存储位置  快递 信息清空
                            expressMap.remove(expressMap.get(delExpressNumber).getCode());
                            expressMap.remove(expressMap.get(delExpressNumber).getX());
                            expressMap.remove(expressMap.get(delExpressNumber).getY());
                            expressMap.remove(delExpressNumber);
                            System.out.println("快递删除成功!");
                            count --;
                            // System.out.println("当前快递存储数为:"+count);
                        }
                    }
                }
                break;

                case 4 :{               // 查看所有快递
                    for (String number : expressMap.keySet()) {
                        Express e = expressMap.get(number);
                        System.out.println("第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列的快递 快递信息: " +
                                "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】," +
                                "取件码为【" + e.getCode() + "】。");
                    }
                    // System.out.println("当前快递存储数为:"+count);
                    break;
                }

            }

        }


    }

    private static void uClient() {
        int code = v.uMenu();

        int temp = 0;
        // 根据code找快递单号
        for (String number : expressMap.keySet()) {
            temp ++ ;
            // 单号存在
            if (expressMap.get(number).getCode() == code ){
                String s = number;
                Express e = expressMap.get(s);
                System.out.println("快递在第【" + (e.getX() + 1) + "】排第【" + (e.getY() + 1) + "】列 快递信息: " +
                        "快递公司为【" + e.getCompany() + "】,快递号单号为【" + e.getNumber() + "】。");
                // 用户取件后
                System.out.println("取货成功!");
                expressMap.remove(e.getCode());
                expressMap.remove(e.getX());
                expressMap.remove(e.getY());
                expressMap.remove(e.getNumber());
                count --;
                break;
            // 单号不存在
            } else if (count == temp ){
                v.printNull();
            }
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值