面向对象+集合+IO实现快递驿站

1 篇文章 0 订阅

代码均由IntelliJ IDEA 2020.1.4 x64运行
任务概述:
在这里插入图片描述
要求:运用面向对象,集合,IO流,实现快递管理系统



包视图:
在这里插入图片描述

  • Express1:快递信息存储类
  • MyList:调度逻辑类
  • View1:视图类
  • util:序列化与反序列化
  • main:调用实现类

注:导包可能出现问题,这里就不用我的包了,运用时看情况导包。

1.快递信息储存类:

public class Express1 implements Serializable {
    private String number;
    private String company;
    private int code;

    public Express1() {
    }

    public Express1(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Express1 express1 = (Express1) o;
        return Objects.equals(number, express1.number);
    }

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

    public String getNumber() {
        return number;
    }

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

    public String getCompany() {
        return company;
    }

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

    public int getCode() {
        return code;
    }

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


视图类:

/**
 * 视图类
 */
public class View1 {
    private Scanner input = new Scanner(System.in);//输入控制台

    /**
     * 欢迎界面
     */
    public void welcome(){
        System.out.println("欢迎使用此快递管理系统");
    }

    /**
     * 退出界面
     */
    public void bye(){
        System.out.println("期待您的下次使用");
    }

    /**
     * 主菜单
     * @return
     */
    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);//将输入的值转换为int类型
        }catch (Exception e){

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

    /**
     * 快递员菜单
     * @return
     */
    public int Courier(){
        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 (Exception e){

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

    /**
     * 快递录入
     * @return
     */
    public Express1 Insert(){
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入快递单号:");
        String number = input.nextLine();
        System.out.println("请输入快递公司:");
        String company = input.nextLine();
        Express1 e = new Express1();
        e.setNumber(number);//将快递单号设置为新输入的值
        e.setCompany(company);//将快递公司设置为新输入的值
        return e;
    }

    /**
     * 快递删除
     * @return
     */
    public int delete() {
        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 (Exception e) {

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

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

    /**
     * 没有找到快递
     */
    public void printNull(){
        System.out.println("没有找到该快递");
    }

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

    /**
     * 打印所有快递信息
     * @param e
     */
    public void printExpress(Express1 e){
        System.out.println("快递信息如下:");
        System.out.println("快递公司;"+e.getCompany()+",快递单号:"+e.getNumber()+",取件码:"+e.getCode());
    }

    /**
     * 查看所有快递
     * @param list
     */
    public void printAll(ArrayList<Express1> list){
        if (list.isEmpty()){
            System.out.println("没有信息");
            return;
        }else {
            System.out.println(list.toArray().toString());
        }
    }

    /**
     * 用户界面
     * @return
     */
    public int User(){
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入取件码:");
        String code = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(code);
        }catch (Exception e){

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

    /**
     * 重复存储
     */
    public void expressExits(){
        System.out.println("快递已存在,请勿重复存储:");
    }

    /**
     * 操作成功
     */
    public void success(){
        System.out.println("操作成功");
    }

}


调度逻辑类:

public class MyList {
    private ArrayList<Express1> list = new ArrayList<>();//创建集合
    private Random random = new Random();//随机数
    private static final String FILE_NAME = "express.txt";//定义一个不可改变的文件名称

    /**
     * 判断文件是否存在
     */
    static {
        System.out.println("静态代码块执行---------");
        File file = new File(FILE_NAME);//创建文件对象
        //如果文件不存在,则创建一个文件
        if (!file.exists()){
                try {
                    if (file.createNewFile()){
                        System.out.println("第一次启动项目,创建储存文件成功");
                    }
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    public MyList() {
        //初始化数据,从文件中读取数据
            System.out.println("构造方法执行-------------");
            try {
                Object obj = util.readFile(FILE_NAME);//读取文件
                //如果文件不为空且是集合类型,则放入集合中
                if (obj!=null && obj instanceof ArrayList){
                    list = (ArrayList<Express1>) obj;
                }
            } catch (IOException e) {
                System.out.println(e.getMessage());
            } catch (ClassNotFoundException e) {
                System.out.println(e.getMessage());
            }
        }

    /**
     * 快递录入
     * @param e
     * @return
     * @throws IOException
     */
    public boolean add(Express1 e) throws IOException {
        //设置集合长度为100
        if (list.size() == 100){
            return false;
        }
        //判断集合中该位置是否有快递
        int x = -1;
        int y = -1;
        while (true){
            x = random.nextInt(10);
            y = random.nextInt(10);
            if (!(list.contains(x) && list.contains(y))){
                break;
            }
        }
        int code = randomCode();//生成取件码
        e.setCode(code);//设置取件码为新生成的值
        list.add(e);//添加到集合中
        util.writeFile(list,FILE_NAME);//将集合写入文件当中
        return true;
    }

    /**
     * 生成随机取件吗
     * @return
     */
    public int randomCode(){
        while (true){
            int code = random.nextInt(900000)+100000;//随机生成六位数取件码
            Express1 e = findByCode(code);//判断取件码是否已经存在
            //如果为空,则不存在,返回给快递录入阶段
            if (e == null){
                return code;
            }
        }
    }

    /**
     * 判断取件码是否重复
     * @param code
     * @return
     */
    public Express1 findByCode(int code){
        for (int i = 0; i < list.size(); i++) {
            //如果集合中有快递,且取件码相同,则重复,否则不重复,返回null
            if (list.size()!=0 && list.get(i).getCode() == code){
                return list.get(i);
            }
        }
        return null;
    }

    /**
     * 快递删除
     * @param e
     * @throws IOException
     */
    public void delete(Express1 e) throws IOException {
        p:for (int i = 0; i < list.size(); i++) {
            if (e.equals(list.get(i))){
                list.remove(i);//快递删除
                util.writeFile(list,FILE_NAME);//将删除后的集合写入文件中
                break p;
            }
        }
    }

    /**
     * 查询快递单号
     * @param number
     * @return
     */
    public Express1 findByNumber(String number){
        Express1 e = new Express1();
        e.setNumber(number);//设置快递单号为新输入的值
        for (int i = 0; i < list.size(); i++) {
            if (e.getNumber().equals(list.get(i).getNumber())){
                return list.get(i);
            }
        }
        return null;
    }

    /**
     * 修改快递-删旧添新
     * @param oldExpress
     * @param newExpress
     * @throws IOException
     */
    public void update(Express1 oldExpress,Express1 newExpress) throws IOException {
        delete(oldExpress);
        add(newExpress);
    }

    /**
     * 查看所有快递信息
     */
    public void findAll(){
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());//将集合中的信息循环按照字符串类型打印
        }
    }

}


IO序列化与反序列化:

public class util {
    /**
     * 反序列化,从指定文件中读取数据
     * @param fileName
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static Object readFile(String fileName) throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(fileName);//字节流
        ObjectInputStream objectInputStream= new ObjectInputStream(fileInputStream);//转换为字符流
        return objectInputStream.readObject();
    }

    /**
     * 序列化,写入数据到指定文件
     * @param obj
     * @param fileName
     * @throws IOException
     */
    public static void writeFile(Object obj,String fileName) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(fileName);//字节流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);//转换为字符流
        objectOutputStream.writeObject(obj);
    }
}


调用实现类:

public class main {
    private static View1 v = new View1();//初始化视图对象
    private static MyList list = new MyList();//初始化dao对象

    public static void main(String[] args) throws IOException {
        /**
         * 欢迎界面
         */
        v.welcome();
        /**
         * 主菜单
         */
        p:while (true){
            int menu = v.menu();//输入功能序号
            switch (menu){
                case 1:
                    cClient();
                    break;
                case 2:
                    uClient();
                    break;
                case 0:
                    break p;
            }
        }
        /**
         * 退出界面
         */
        v.bye();
    }

    /**
     * 快递员菜单
     * @throws IOException
     */
    public static void cClient() throws IOException {
        p:while (true){
            int menu = v.Courier();//输入功能序号
            switch (menu){
                case 1:
                    Insert();
                    break;
                case 2:
                    delete();
                    break;
                case 3:
                    upadte();
                    break;
                case 4:
                    All();
                    break;
                case 0:
                    break p;
            }
        }
    }

    /**
     * 快递录入
     * @throws IOException
     */
    public static void Insert() throws IOException {
        Express1 e = v.Insert();//输入快递信息
        list.add(e);//添加到集合中
    }

    /**
     * 快递删除
     * @throws IOException
     */
    public static void delete() throws IOException {
        String number = v.findByNumber();//输入要删除的快递单号
        Express1 e = list.findByNumber(number);//判断此快递单号是否存在
        //如果为空,不存在,反之删除
        if (e == null){
            v.printNull();
        }else {
            v.printExpress(e);
            int type= v.delete();//输入功能序号
            if (type == 1){
                list.delete(e);
                v.success();
            }
        }
    }

    /**
     * 修改快递
     * @throws IOException
     */
    public static void upadte() throws IOException {
        String number = v.findByNumber();//输入要修改的快递单号
        Express1 e = list.findByNumber(number);//判断此快递单号是否存在
        Express1 e2 = e;//新
        if (e == null){
            v.printNull();
        }else {
            v.printExpress(e);
            v.update(e2);//输入新的快递信息
            list.update(e,e2);//删旧添新
            v.printExpress(e2);
        }
    }

    /**
     * 查看所有快递信息
     */
    public static void All(){
        list.findAll();//打印所有快递信息
    }

    /**
     * 用户操作
     * @throws IOException
     */
    public static void uClient() throws IOException {
        int code = v.User();//输入取件码
        Express1 e = list.findByCode(code);//判断此取件码是否存在
        if (e == null){
            v.printNull();
        }else {
            v.success();//取出成功
            list.delete(e);//删除快递信息
            v.printExpress(e);
        }
    }
}


注:仅供参考,可以根据代码自己修改。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发阳光旅行网app中用户下单功能,可实现用户添加订单并完善出行人信息、修改订单,删除订单以及打印行程信息等功能。 具体功能要求如下: (1)显示系统主菜单 包括添加出行订单、查看我的出行订单、修改订单信息、删除出行人、查看行程、退出系统6项功能,其他功能本项目不做要求,当用户选择功能编号后可进入执行相应功能。执行结果如图1所示。 图1 主菜单 (2)添加出行订单 填写出行日期、联系人手机号码、循环录入出行人信息。 出行人信息包括:  出行人类别:成人、儿童(1.2m以下)、老人(65岁以上)  姓名  年龄(如选择类别为老人,输入年龄不足65岁的,显示提示信息“对不起,老人订单年龄需为65岁以上!”)  如果是儿童,需确定是否占床 每成功录入一条出行人信息后,显示出其详细信息,并计算出行金额。定价如下:  成人:2000元/人  儿童:免费,如需占床另加30元  老人:半价,即1000元/人 当一条出行人信息录入完毕后,提示“是否继续添加(Y/N)?”,此处不区分大小写,当输入y或Y时继续录入下一条,否则显示订单信息,包括:  出行日期  联系人手机号码  订单总金额(即所有出行人定单金额之和) 最后显示主菜单。执行效果如图2所示。 图2 添加出行订单 (3)查看我的出行订单信息 查看我的出行订单:查看所录入的订单信息。包括出行日期、联系人手机号码、所有出行人信息,运行效果如图3所示。 图3 查看我的出行订单 (4)修改行程信息 可修改出行日期、联系人手机号码,要求手机号码必须为11位,否则抛出异常信息,提示“手机号码必须为11位”,运行效果如果4所示。 图4 手机号码不是11位 正确修改后,显示修改后的信息,并提示“修改成功!”。如图5所示。 图5 修改订单成功 (5)删除出行人 填写要删除的出行人姓名,执行删除操作,删除成功后给出提示“删除成功!”,如图6所示。如果输入姓名错误,则提示“对不起,定单中不包含此游客信息!”如图7所示。 图6 删除出行人成功 图7 删除出行人失败 (6)查看行程 显示本次旅行行程信息。即读取“旅游行程.txt”文件(素材提供),显示在控制台。运行效果如图8所示。 图8 查看行程 (7)退出系统 退出当前系统,显示“欢迎下次再来。”如图9所示。 三、要求与实现步骤 (一)不使用数据库,使用对象和集合存储数据 (二)定义实体类(成人订单、儿童订单、老人订单),儿童订单、老人订单为成人订单的子类。实体类至少包含但不局限于以上3个。 (三)在各实体类中均需实现各自计算订单价格、显示订单信息的方法,使用方法的重写。 (四)定义工具类,实现查看我的出行订单、添加订单、修改行程信息、删除出行人、查看行程等方法。需使用到对象传参。 (五)使用泛型集合存储所有出行人信息,使用集合的遍历实现查看订单信息、统计订单总金额、删除出行人等功能。 (六)显示信息时,只有儿童出行人需显示是否占座,需使用面向对象多态实现。 (七)修改行程信息时,当手机号码录入错误时需使用throw手动抛出异常。 (八)使用I/O技术实现文件的读取功能,将文本文件“行程信息.txt”中的内容显示到控制台。 (九)定义测试类,完成项目功能菜单以及整体流程,调用相应方法实现具体功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值