房屋出租系统(Java实现-命令行练习版)

简介: 房屋出租系统(Java实现-命令行练习版)

需求


实现基于文本界面的房屋出租系统


能够实现对房屋信息的添加、修改和删除(数组),并能够展示房屋明细


设计


项目设计-程序框架图(分层模式-->当软件比较复杂,需要模式管理)逐渐理解设计模式


(1,系统有哪些类【文件】 2,明确类与类的调用关系)


image.png


实现


准备1:工具类Utility.java


便于获取输入,提高开发效率


在实际开发中,公司都会提供相应的工具类和开发库,可以提高开发效率,程序员也需要看懂别人写的代码,并能够正确使用。


准备2:对象类House.java生成setter和getter方法、构造器,重写toString()方法,便于使用

/**
 * House的对象表示一个房屋信息
 */
public class House {
    //编号  房主  电话  地址  月租  状态(未出租/已出租)
    private int id;
    private String name;
    private String phone;
    private String address;
    private int rent;
    private String state;
    //构造器和setter,getter,可自动生成
    public House(int id, String name, String phone, String address, int rent, String state) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.rent = rent;
        this.state = state;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getRent() {
        return rent;
    }
    public void setRent(int rent) {
        this.rent = rent;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    //为了方便的输出对象信息,重写toString方法
    //编号  房主  电话  地址  月租  状态(未出租/已出租)
    @Override
    public String toString() {
        return  id +
                "\t\t" + name +
                "\t" + phone +
                "\t\t" + address +
                "\t" + rent +
                "\t" + state ;
    }
}

技巧1:化繁为简,逐步实现


技巧2:实现功能三部曲:明确功能【需求】->思路分析【确定需求细节】->代码实现


实现1-显示主菜单和完成退出软件功能


image.png


需求:用户打开软件,可以看到主菜单,退出软件


思路:在HouseView.java类中,编写一个方法mainMenu(),显示菜单,并有退出选项


代码:

//显示主菜单
    public void mainMenu() {
        do {
            System.out.println("\n=============房屋出租系统菜单============");
            System.out.println("\t\t\t1 新 增 房 源");
            System.out.println("\t\t\t2 查 找 房 屋");
            System.out.println("\t\t\t3 删 除 房 屋 信 息");
            System.out.println("\t\t\t4 修 改 房 屋 信 息");
            System.out.println("\t\t\t5 房 屋 列 表");
            System.out.println("\t\t\t6 退      出");
            System.out.print("请输入你的选择(1-6): ");
            key = Utility.readChar();
            switch (key) {
                case '1':
                    addHouse();
                    break;
                case '2':
                    findHouse();
                    break;
                case '3':
                    delHouse();
                    break;
                case '4':
                    update();
                    break;
                case '5':
                    listHouses();
                    break;
                case '6':
                    exit();
                    break;
            }
        } while (loop);
    }

实现2-完成显示房屋列表的功能


image.png


需求:用户可以以列表的形式查看房屋信息,编号 房主 电话 地址 月租 状态(未出租/已出租)


思路:在HouseView.java类中,编写展示房屋列表信息界面的方法,在HouseService.java类中,编写返回房屋信息的方法


代码:

//HouseView.java
 //编写listHouses()显示房屋列表
    public void listHouses() {
        System.out.println("=============房屋列表============");
        System.out.println("编号\t房主\t电话\t地址\t月租\t状态(未出租/已出租)");
        House[] houses = houseService.list();//调用houseService类的list()方法,获取所有房屋信息
        for (int i = 0; i < houses.length; i++) {
            if (houses[i] == null) {//过滤空信息,展示已有全部房屋信息
                break;
            }
            System.out.println(houses[i]);
        }
        System.out.println("=============房屋列表显示完毕============");
    }
//HouseService.java
//list方法,返回houses
    public House[] list() {
        return houses;
    }

实现3-添加房屋信息的功能

image.png


需求:用户可以添加房屋信息至系统


思路:在HouseView.java类中,编写展示添加房屋信息界面的方法,在HouseService.java类中,编写添加房屋信息至House对象数组的方法。(注意:新添加的房屋的id以自增长方式增加;增加了数组扩容机制)


代码:

//HouseView.java
//编写addHouse() 接收输入,创建House对象,调用add方法
    public void addHouse() {
        System.out.println("=============添加房屋============");
        System.out.print("姓名: ");
        String name = Utility.readString(8);
        System.out.print("电话: ");
        String phone = Utility.readString(12);
        System.out.print("地址: ");
        String address = Utility.readString(16);
        System.out.print("月租: ");
        int rent = Utility.readInt();
        System.out.print("状态: ");
        String state = Utility.readString(3);
        //创建一个新的House对象, 注意id 是系统分配的,
        House newHouse = new House(0, name, phone, address, rent, state);
        if (houseService.add(newHouse)) {
            System.out.println("=============添加房屋成功============");
        } else {
            System.out.println("=============添加房屋失败============");
        }
    }
//HouseService.java
//add方法,添加新对象,返回boolean
    public boolean add(House newHouse) {
        //判断是否还可以继续添加(我们暂时不考虑数组扩容的问题) => 能否自己加入数组扩容机制(~~)
        if(houseNums == houses.length) {//不能再添加
            houses = addLengthArray(houses);//作者增加了数组扩容机制
            houses[houseNums++] = newHouse;
            newHouse.setId(++idCounter);
            return true;
        }else {
            //把newHouse对象加入到,新增加了一个房屋
            houses[houseNums++] = newHouse;
            //我们程序员需要设计一个id自增长的机制, 然后更新newHouse的id
            newHouse.setId(++idCounter);
            return true;
        }
    }
 //数组动态扩容机制,可以将数组类型修改应用到其他类型的数组动态扩容
    public static House[] addLengthArray(House[] house){
        House [] newHouse = new House [house.length*2];//以原数组的二倍扩容
        System.arraycopy(house,0,newHouse,0,house.length);//复制house数组从0位置至house.length位置到newHouse数组0位置到array.length位置
        return newHouse;
    }

实现4-完成删除房屋信息功能


image.png


需求:用户可以选择删除房屋,以标号为依据,为防止用户误删,系统提示是否确认删除


思路:在HouseView.java类中,编写展示删除房屋信息的方法,在HouseService.java类中,编写删除Houses对象数组中房屋信息的方法。


代码:

//HouseView.java
//编写delHouse() 接收输入的id,调用Service 的del方法
    public void delHouse() {
        System.out.println("=============删除房屋信息============");
        System.out.print("请输入待删除房屋的编号(-1退出):");
        int delId = Utility.readInt();
        if (delId == -1) {
            System.out.println("=============放弃删除房屋信息============");
            return;
        }
        //注意该方法本身就有循环判断的逻辑,必须输出Y/N
        char choice = Utility.readConfirmSelection();
        if (choice == 'Y') {//用户确认删除
            if (houseService.del(delId)) {
                System.out.println("=============删除房屋信息成功============");
            } else {
                System.out.println("=============房屋编号不存在,删除失败============");
            }
        } else {
            System.out.println("=============放弃删除房屋信息============");
        }
    }
//HouseService.java
//del方法,根据用户输入的id,删除该id房屋信息
    public boolean del(int delId) {
        //首先找到要删除的房屋信息对应的下标
        int index = -1;
        for(int i = 0; i < houseNums; i++) {
            if(delId == houses[i].getId()) {//要删除的房屋(id),是数组下标为i的元素
                index = i;//使用index记录i
            }
        }
        if(index == -1) {//index依然是初始值,说明delId在数组中不存在
            return false;
        }
        for(int i = index; i < houseNums - 1; i++) {//找到指定id对应的数组下标 index ,将index后的每个数组值覆盖到该数组值的前一位,以达到删除下标为index的数组值的目的
            houses[i] = houses[i+1];
        }
        houses[--houseNums] = null;//覆盖之后,数组存储的最后一个房屋信息多余,所以把当下存在的房屋信息的最后一个置为null
        return true;
    }

实现5-完善退出确认功能

image.png


需求:用户在退出时提示“确认是否退出(Y/N):”,必须输入y/n,否则循环提示


思路:在HouseView.java类中,编写退出确认方法


代码:

//完成退出确认
    public void exit() {
        //这里我们使用Utility提供方法,完成确认
        char c = Utility.readConfirmSelection();
        if (c == 'Y') {
            loop = false;
        }
    }

实现6-完成根据id查找房屋信息的功能

image.png

需求:用户输入房屋id,查找房屋信息


思路:在HouseView.java类中,编写展示查找房屋信息的方法,获取房屋id,在HouseService.java类中,编写查找并返回Houses对象数组中房屋信息的方法。


代码:

//HouseView.java
//根据id查找房屋信息
    public void findHouse() {
        System.out.println("=============查找房屋信息============");
        System.out.print("请输入要查找的id: ");
        int findId = Utility.readInt();
        //调用方法
        House house = houseService.findById(findId);
        if (house != null) {
            System.out.println(house);
        } else {
            System.out.println("=============查找房屋信息id不存在============");
        }
    }
//HouseService.java
//findById方法,返回House对象或者null
    public House findById(int findId) {
        //遍历数组
        for(int i = 0; i < houseNums; i++) {
            if(findId == houses[i].getId()) {
                return houses[i];
            }
        }
        return null;
    }

实现-完成修改房屋信息的功能


image.png


需求:用户输入房屋id,修改房屋信息


思路:在HouseView.java类中,编写展示修改房屋信息的方法,获取用户输入的id,根据id调用findById()方法,查找到House对象,修改指定属性。


代码:

//HouseView.java
//根据id修改房屋信息
    public void update() {
        System.out.println("=============修改房屋信息============");
        System.out.println("请选择待修改房屋编号(-1表示退出)");
        int updateId = Utility.readInt();
        if (updateId == -1) {
            System.out.println("=============你放弃修改房屋信息============");
            return;
        }
        //根据输入得到updateId,查找对象
        //老师特别提示:返回的是引用类型[即:就是数组的元素]
        //因此老师在后面对house.setXxx() ,就会修改HouseService中houses数组的元素!!!!!!!!!!
        House house = houseService.findById(updateId);
        if (house == null) {
            System.out.println("=============修改房屋信息编号不存在..============");
            return;
        }
        System.out.print("姓名(" + house.getName() + "): ");
        String name = Utility.readString(8, "");//这里如果用户直接回车表示不修改该信息,默认""
        if (!"".equals(name)) {//修改
            house.setName(name);
        }
        System.out.print("电话(" + house.getPhone() + "):");
        String phone = Utility.readString(12, "");
        if (!"".equals(phone)) {
            house.setPhone(phone);
        }
        System.out.print("地址(" + house.getAddress() + "): ");
        String address = Utility.readString(18, "");
        if (!"".equals(address)) {
            house.setAddress(address);
        }
        System.out.print("租金(" + house.getRent() + "):");
        int rent = Utility.readInt(-1);
        if (rent != -1) {
            house.setRent(rent);
        }
        System.out.print("状态(" + house.getState() + "):");
        String state = Utility.readString(3, "");
        if (!"".equals(state)) {
            house.setState(state);
        }
        System.out.println("=============修改房屋信息成功============");
    }


相关文章
|
7天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
35 5
|
7天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
152 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
9天前
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
47 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
10天前
|
前端开发 JavaScript Java
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
57 13
【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
|
10天前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
57 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
13天前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
55 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
26天前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
57 6
|
4天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
45 14
|
7天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
37 13
|
8天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。

热门文章

最新文章