快递e栈集合实现

快递e栈(集合篇)

MVC模式(三层架构模式)

概念:

​ MVC(Model-View-Controller)是一种框架模式。经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器。

M:即model模型是指模型表示业务规则。
V:即View视图是指用户看到并与之交互的界面。
C:即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求。

题目:

这样的需求是不是似曾相识?哈哈哈,是的,快递 E 栈又来了,之前我们
已经写了好几个版本,比如数组版,面向对象版。现在呢我们又学习了新知识,快来应用一下,同样的需求,这里我们要求使用集合的技术点来实现。学会:
以不变应万变
任务过程:
1、明确需求,基于面向对象思想,创建用户类和快递类
2、选择合适的集合保存快递信息,这里涉及到根据指定单号快速定位到快递信息,结合每个集合的特点,这里建议使用 Map 集合进行数据存储,key为快递单号,value 为快递对象

在这里插入图片描述

代码实现

1、cn.suzihan.java.courierCabinet.view包

包含的类:View类 用于用户的交互

package cn.suzihan.java.courierCabinet.view;

import cn.suzihan.java.courierCabinet.bean.Express;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * view 视图层
 *
 * @author sunzihan
 */
public class View {
    private Scanner input = new Scanner(System.in);

    /**
     * 欢迎
     */
    public void welCome() {
        System.out.println("欢迎使用快递e栈系统!");
    }

    /**
     * 结束
     */
    public void bye() {
        System.out.println("期待您的下次使用!");
    }

    /**
     * 开始菜单
     */
    public int menu() {
        System.out.println("请按照提示完成操作:");
        System.out.println("请输入您的身份:1-快递员  2-用户  0-退出");
        String s = input.nextLine();
        int number = -1;
        try {
            number = Integer.parseInt(s);
        } catch (NumberFormatException e) {

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

    /**
     * 快递员菜单
     *
     * @return
     */
    public int courierMenu() {
        System.out.println("请按照提示完成操作:");
        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 number = -1;
        try {
            number = Integer.parseInt(s);
        } catch (NumberFormatException e) {

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

    /**
     * 用户界面
     *
     * @return
     */
    public String userMenu() {
        System.out.println("请按照提示完成操作:");
        System.out.println("请输入6位取件码:");
        String s = input.nextLine();
        int number = -1;
        try {
            number = Integer.parseInt(s);
        } catch (NumberFormatException e) {

        }
        if (number < 100000 || number > 999999) {
            System.out.println("您的输入有误,请重新输入!");
            return userMenu();
        }
        return s;
    }

    /**
     * 添加快递单号
     */
    public String addNumber() {
        System.out.println("请按照提示完成操作:");
        System.out.println("请输入快递单号:");
        String number = input.nextLine();
        return number;
    }


    /**
     * 添加快递其他信息
     */
    public Express addElse() {
        System.out.println("请输入快递公司:");
        String company = input.nextLine();
        Express express = new Express();
        express.setCompany(company);
        return express;
    }

    /**
     * 操作快递单号
     */
    public String findNumber() {
        System.out.println("请按照提示完成操作:");
        System.out.println("请输入要操作的快递单号:");
        String number = input.nextLine();

        return number;
    }

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

    /**
     * 删除快递信息
     */
    public int delete() {
        System.out.println("是否要删除此快递:1-是   2-否");
        String s = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(s);
        } catch (NumberFormatException e) {

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

    /**
     * 打印所有信息
     */
    public void printAll(HashMap<String, Express> map) {
        if (map.size() != 0) {
            for (Map.Entry<String, Express> me : map.entrySet()) {
                System.out.println(me.getValue());
            }
        } else {
            System.out.println("快递柜无快递!!!");
        }

    }

    /**
     * 成功信息打印
     */
    public void success(int num) {
        if (num == 1) {
            System.out.println("添加成功!!");
        } else if (num == 2) {
            System.out.println("修改成功");
        } else if (num == 3) {
            System.out.println("删除成功");
        } else if (num == 4) {
            System.out.println("取件成功,欢迎您下次取件");
        }
    }

    /**
     * 失败信息打印
     */
    public void fail(int num) {
        if (num == 1) {
            System.out.println("单号已存在,请重新输入!");
        } else if (num == 2) {
            System.out.println("您输入的单号不存在,请重新输入!");
        } else if (num == 3) {
            System.out.println("取消删除。正在返回....");
        } else if (num == 4) {
            System.out.println("您输入的取件码不存在,请重新输入!");
        }
    }


}

2、cn.suzihan.java.courierCabinet.bean包

包含的类:Express类 描述快递对象,包含快递对象的各种属性及方法

package cn.suzihan.java.courierCabinet.bean;

import java.util.Objects;

public class Express {
    /**
     * position:位置
     * code:取件码
     * company:公司
     * number:单号
     */
    private String number;
    private int position;
    private String code;
    private String company;

    public Express() {
    }

    public Express(int position, String code, String company) {
        this.position = position;
        this.code = code;
        this.company = company;
    }

    @Override
    public String toString() {
        return "快递单号为:" + number +
                ", 快递公司为:" + company +
                " , 快递位置在:" + position +
                "柜 , 取件码为:" + code +
                '。';
    }

    @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(number);
    }

    public String getNumber() {
        return number;
    }

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

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public String getCode() {
        return code;
    }

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

    public String getCompany() {
        return company;
    }

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

3、cn.suzihan.java.courierCabinet.dao包

包含的类:ExpressDao类 用于数据存储及业务逻辑

package cn.suzihan.java.courierCabinet.dao;

import cn.suzihan.java.courierCabinet.bean.Express;
import java.util.HashMap;
import java.util.Random;

/**
 * @author sunzihan
 */
public class ExpressDao {
    static Random random = new Random();
    static HashMap<String, Express> map = new HashMap<>();
    static HashMap<String, String> map1 = new HashMap<>();

    /**
     * 快递录入
     */
    public static boolean add(String number, Express express) {
        if (map.containsKey(number)) {
            return false;
        }
        //添加单号信息到Express
        express.setNumber(number);
        //添加随机6为取件码
        String code = codeRandom();
        express.setCode(code);
        //添加快递柜位置信息
        map.put(number, express);
        map1.put(code, number);
        int position = positionRandom(number);
        express.setPosition(position);
        return true;
    }

    /**
     * 通过单号查询快递是否存在
     * @param number:单号
     */
    public static boolean find(String number) {
        //根据单号判断单号关键字是否存在
        if (map.containsKey(number)) {
            return true;
        }
        return false;
    }
    /**
     * 通过取件码查询快递是否存在
     * @param code:取件码
     */
    public static boolean findCode(String code) {
        //根据取件码判断取件码关键字是否存在
        if (map1.containsKey(code)) {
            return true;
        }
        return false;
    }
    /**
     * 修改快递信息
     * number为单号
     */
    public static boolean update(String number, Express newExpress) {
        if (find(number)) {
            Express oldExpress = map.get(number);
            newExpress.setCode(oldExpress.getCode());
            newExpress.setPosition(oldExpress.getPosition());
            map.remove(oldExpress.getNumber());
            map.put(newExpress.getNumber(), newExpress);
            return true;
        }
        return false;
    }
    /**
     * 删除快递信息
     */
    public static boolean delete(String nummer) {
        if (find(nummer)) {
            map.remove(nummer);
            return true;
        }
        return false;
    }
    /**
     * 删除快递信息
     */
    public static boolean deletecode(String code) {
        if (findCode(code)) {
            map.remove(map1.get(code));
            map1.remove(code);
            return true;
        }
        return false;
    }
    /**
     * 生成随机取件码
     */
    public static String codeRandom() {
        while (true) {
            int code1 = random.nextInt(900000) + 100000;
            String code = Integer.toString(code1);
            if (!map1.containsKey(code)) {
                return code;
            }
        }
    }
    /**
     * 生成随机柜子位置
     */
    public static int positionRandom(String number) {
        Express express = map.get(number);
        while (true) {
            int position = random.nextInt(200);
            if (express.getPosition() != position) {
                return position;
            }
        }
    }
    /**
     * 打印
     */
    public static HashMap<String, Express> print() {
        return map;
    }

}

4、cn.suzihan.java.courierCabinet.main包

包含的类:Main类 Courier类 User类

Main类
package cn.suzihan.java.courierCabinet.main;

import cn.suzihan.java.courierCabinet.view.View;

public class Main {
    public static void main(String[] args) {
        View view = new View();

        //欢迎
        view.welCome();

        while (true) {
            int menu = view.menu();
            switch (menu) {
                case 1:
                    Courier.courier();
                    break;
                case 2:
                    User.userOprate();
                    break;
                case 0:
                    view.bye();
                    return;
            }

        }

    }
}
Courier类
package cn.suzihan.java.courierCabinet.main;

import cn.suzihan.java.courierCabinet.bean.Express;

import cn.suzihan.java.courierCabinet.dao.ExpressDao;
import cn.suzihan.java.courierCabinet.view.View;

import java.util.HashMap;

public class Courier {
    static View view = new View();

    /**
     * Courier页面
     */
    public static void courier() {
        int num = 1;
        while (num != 0) {
            int courierMenu = view.courierMenu();
            switch (courierMenu) {
                case 1:
                    addOperate();
                    break;
                case 2:
                    updateOprate();
                    break;
                case 3:
                    deleteOprate();
                    break;
                case 4:
                    HashMap<String, Express> print = ExpressDao.print();
                    view.printAll(print);
                    break;
                case 0:
                    num = 0;
                    break;


            }
        }

    }


    /**
     * 添加信息集成
     */
    public static void addOperate() {
        String number = view.addNumber();
        Express express = view.addElse();
        boolean add = ExpressDao.add(number, express);
        if (add) {
            view.success(1);
        } else {
            view.fail(1);
        }
    }

    /**
     * 修改信息集成
     */
    public static void updateOprate() {
        String number = view.findNumber();
        boolean b = ExpressDao.find(number);
        if (b) {
            Express newExpress = view.update();
            ExpressDao.update(number, newExpress);
            view.success(2);
        } else {
            view.fail(2);
        }
    }


    /**
     * 删除信息集成
     */
    public static void deleteOprate() {
        String number = view.findNumber();
        boolean b = ExpressDao.find(number);
        if (b) {
            int delete = view.delete();
            if (delete == 1) {
                view.success(3);
                ExpressDao.delete(number);
            } else if (delete == 2) {
                view.fail(3);
                return;
            }
        } else {
            view.fail(2);
        }
    }
}

User类
package cn.suzihan.java.courierCabinet.main;

import cn.suzihan.java.courierCabinet.dao.ExpressDao;
import cn.suzihan.java.courierCabinet.view.View;

public class User {

    static View view = new View();

    public static void userOprate() {
        String code = view.userMenu();
        boolean b = ExpressDao.findCode(code);
        if (b) {
            ExpressDao.deletecode(code);
            view.success(4);
        } else {
            view.fail(4);

        }

    }
}

题中遇到的问题:

1.用户如何取件?

这道题我是用Map 集合进行数据存储,key为快递单号,value 为快递对象,快递对象里面有快递单号、快递公司、快递柜子位置、取件码等属性

咋们知道map集合我们可以通过key,来取内容值,所以

方案一,再创建一个key为取件码,value为快递单号

方案二,再创建一个key为取件码,value为快递对象

虽然我题目是用方案一,不过我更推荐方案二,各位可以去试一试~~~

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
VxWorks是一个实时操作系统,提供了多种调试工具来帮助开发人员进行故障定位,其中包括回溯功能。下面是VxWorks中回溯实现的代码: ```c /* stackTraceShow - print a stack trace */ void stackTraceShow ( int tid, /* task ID, 0 means take from context */ FILE *fp /* output file pointer */ ) { REG_SET regSet; /* task's register set */ /* take registers from context if tid is zero */ if (tid == 0) { taskIdSelf (); /* get own task ID */ taskRegsGet (0, &regSet);/* take registers from context */ } else { if (taskRegsGet (tid, &regSet) != OK) { fprintf (fp, "Illegal task ID.\n"); return; } } /* print out the stack trace */ fprintf (fp, "Stack trace for task %#x:\n", tid); dsmPrint ((int)regSet.pc, (int)regSet.sp, fp, (FUNCPTR)printExc); fprintf (fp, "...\n"); } ``` 该函数接收两个参数,一个是要打印回溯信息的任务ID,另一个是输出文件指针。如果任务ID为0,则表示打印当前任务的回溯信息。 该函数首先获取任务的寄存器集合,然后调用dsmPrint函数打印回溯信息。dsmPrint函数是VxWorks中的一个函数,用于将指定地址范围内的机器指令转换为汇编指令并打印出来。 在回溯信息中,打印了任务ID和回溯的一部分信息,以“...”结尾。如果想要打印更多的回溯信息,可以调用dsmPrint函数并传递更多的参数。 需要注意的是,该函数只能在VxWorks操作系统中使用,并且需要在系统启动时配置好调试选项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值