java小项目-房屋出租系统


跟韩顺平老师学该项目

项目需求

实现基于文本界面的《房屋出租软件》
能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表


项目界面

主菜单

在这里插入图片描述

新增房源

在这里插入图片描述

查找房源

在这里插入图片描述

删除房源

在这里插入图片描述

修改房源

在这里插入图片描述

房源列表

在这里插入图片描述

退出系统

在这里插入图片描述


项目设计

当软件比较复杂,需要分层管理
在这里插入图片描述


项目实现

明确功能 -> 思路分析 -> 代码实现

准备工具类Utility,提高开发效率

在学习资料中

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

完成House类

  • 房源属性:编号 姓名 电话 地址 租金 出租情况(已出租/未出租)
/**
 * House的对象表示一个房源
 */
public class House {
    private String name;
    private String phone;
    private String address;
    private int rent;
    private String state;
    private int id;
    //构造器
    public House(String name, String phone, String address, int rent, String state, int id) {
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.rent = rent;
        this.state = state;
        this.id = id;
    }
    //重写toString,返回房源信息
    @Override
    public String toString() {
        return id + "\t\t"
                + name + "\t"
                + phone + "\t\t"
                + address + "\t"
                + rent + "\t"
                + state;
    }
    //setter && getter
    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;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

显示主菜单和完成退出软件功能

  • 在HouseView类中,编写一个方法mainMenu显示菜单
private boolean loop = true;
private char key;
public void mainMenu() {
        do {
            System.out.println("==============房屋出租系统==============");
            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();//调用Utility工具类的方法输入并判断
            switch (key) {
                case '1':
                    addHouse();
                    break;
                case '2':
                    searchHouse();
                    break;
                case '3':
                    deleteHouse();
                    break;
                case '4':
                    modifyHouse();
                    break;
                case '5':
                    listHouses();
                    break;
                case '6':
                    exit();
                    break;
                default:
                    System.out.println("输入错误,请输入(1-6)");
                    break;
            }
        } while (loop);
    }

完成显示房源列表的功能

  • 在HouseService类编写方法list返回房源数组
//编写list()返回房源数组
    public House[] list() {
        return houses;//返回houses数组对象,即所有房源
    }
  • 在HouseView类编写方法listHouses(),接收返回的数组,遍历打印有效的房源列表
//编写listHouses()显示房源列表
    public void listHouses() {
        System.out.println("================房源列表================");
        System.out.println("编号\t姓名\t电话\t\t地址\t租金\t出租情况(已出租/未出租)");
        House[] houses = houseService.list();//新的对象名指向房源数组对象
        for (int i = 0; i < houses.length; i++) {
            if (houses[i] == null) {//如果没有房源了即为null,那么就break
                break;
            }
            System.out.println(houses[i]);
        }
        System.out.println("========================================");
    }

完成添加房源信息的功能

  • 在HouseService类中编写add()方法,完成房源数组中对象的添加,数组扩容,返回一个布尔值
//添加房源,House对象的传递
	
    public boolean add(House house) {
        //思考,数组扩容
        //判断当前房源数是否等于给定的数组长度,如果等于,那么想要添加房源就需要对数组扩容
        if (houseNums == houses.length) {
            House[] newHouses = new House[houses.length + 1];//一个新的房源数组对象
            for (int i = 0; i < houses.length; i++) {//克隆对象,将新的数组中的对象指向原来的数组的对象
                newHouses[i] = houses[i];
            }
            houses = newHouses;//旧数组对象名指向新数组对象
            newHouses[houseNums++] = house;//新数组的最后一个元素指向添加的对象house,并且房源数加一
            house.setId(++idCounter);//添加的对象house的id加一并赋值
            return true;
        }
        //如果不扩容就把数组中下标为房源数的对象指向添加的对象house,并且房源数加一,id加一后赋值
        houses[houseNums++] = house;
        house.setId(++idCounter);
        return true;
    }
	public boolean add(House house) {
		//不需要扩容,仅需要判断数组是否已满
        if (houseNums == houses.length) {
            System.out.println("房源已满...");
            return false;
        }
        //如果没满就把数组中下标为房源数的对象指向添加的对象house,并且房源数加一,id加一后赋值
        houses[houseNums++] = house;
        house.setId(++idCounter);
        return true;
    }
  • 在HouseService类中编写addHouse()方法,用Utility工具类中的方法完成属性的输入,创建要添加的House对象,调用add()方法,根据接收返回的布尔值打印信息
//编写addHouse(),创建要添加的House对象,调用add()方法
    public void addHouse() {
        System.out.println("================添加房源================");
        System.out.print("姓名:");
        String name = Utility.readString(4);
        System.out.print("电话:");
        String phone = Utility.readString(11);
        System.out.print("地址:");
        String address = Utility.readString(16);
        System.out.print("月租:");
        int rent = Utility.readInt(6);
        System.out.print("状态(已出租/未出租):");
        String state = Utility.readString(3);
        House newHouse = new House(name, phone, address, rent, state, 0);//需要添加的房源
        if (houseService.add(newHouse)) {//newhouse作为参数传递到add方法,根据返回的布尔值判断是否添加成功
            System.out.println("================添加成功================");
        } else {
            System.out.println("================添加失败================");
        }
    }

完成删除房源信息的功能

  • 在HouseService类中编写delete方法
    //删除房源,删除房源的id作为参数传递
    public boolean delete(int delId) {
        int index = -1;//初始化一个下标为-1
        for (int i = 0; i < houseNums; i++) {
            if (delId == houses[i].getId()) {//当形参delId和数组中某个对象的id一样时,把这个对象的下标赋值给index
                index = i;
                break;//跳出循环
            }
        }
        if (index == -1) {//根据index的值判断是否找到这个要删除的房源,没找到index还是-1.返回一个false
            return false;
        }
        //找到了怎么办?
        //自己想的方法,不太行
//        House[] newHouse = new House[houses.length];
//        for (int i = 0, j = 0; i < houses.length - 1; i++, j++) {
//            if (i == index) {
//                j++;
//            }
//            newHouse[i] = houses[j];
//        }
//        houses = newHouse;
//        houseNums--;
        //老师的方法
        for (int i = index; i < houseNums - 1; i++) {//从找到的元素下标开始到小于房源数减一遍历
            houses[i] = houses[i+1];//把要删除的房源对象后的每个对象在数组中向前移一位
        }
        houses[--houseNums] = null;//最后一个房源指向null,房源数减一
        return true;
    }
}
  • 在HouseView中编写deleteHouse() ,调用Service的delete方法,根据返回的布尔值打印信息
//编写deleteHouse
public void deleteHouse() {
        System.out.println("请输入你要删除的房源id(-1退出):");
        int delId = Utility.readInt();//Utility类的方法
        if (delId == -1) {//放弃删除
            System.out.println("===========你放弃了删除房源===========");
            return;
        }
        char choice = Utility.readConfirmSelection();//Utility的方法,提示是否删除y/n,判断输入的是否为y/n
        if (choice == 'N') {//放弃删除
            System.out.println("===========你放弃了删除房源===========");
            return;
        }
        if (houseService.delete(delId)) {//传递要删除的房源的id到delete(),根据返回的布尔值打印信息
            System.out.println("================删除成功================");
        } else {
            System.out.println("==============该房源不存在==============");
        }
    }

完成退出确认功能

  • 在HouseView类里编写exit方法,要求在退出时提示确定是否退出y/n,必须输入y/n,否则循环提示。
public void exit() {
        //这里我们使用Utility提供的方法,完成确认
        char c = Utility.readConfirmSelection();
        if (c == 'Y') {
            loop = false;
        }
    }

完成根据id查找房屋信息的功能

  • 在HosueService类里编写search方法,用此方法来根据id返回房源对象
//根据id查找房源的方法,返回一个house对象
    public House search(int sId) {
        //注意:这里i < houses.length 当房源数组元素全部为null,即没有房源时,
        //   所有元素都指向null,没有分配内存,只有其名,没有实质内容,
        //   取长度时会抛出NullPointerException 空指针异常,
        //   先排除数组全部元素为空的情况,就不会抛出异常
        //   方法1:换成 i < houseNums 因为没有房源时, houseNums = 0 ,不会抛出异常
        for (int i = 0; i < houseNums; i++) {
            if (sId == houses[i].getId()) {
                return houses[i];
            }
        }
        return null;
        //   方法2:
        //   如果房源数组的第一个元素为null,相当于没有房源,
        //   就直接返回null,不会继续遍历数组

        for (int i = 0; i < houses.length; i++) {
            if (houses[i] == null) {
                return null;
            }
            if (sId == houses[i].getId()) {
                return houses[i];
            }
        }
        return null;
    }
  • 在HouseView里编写searchHouse方法
//根据id查找房源信息方法
public void searchHouse() {
        System.out.println("请输入你要查找的房源id:");
        int sId = Utility.readInt();
        House house = houseService.search(sId);//传递sId给search,引用一个House对象名指向返回的房源对象
        if (house == null) {//返回的是null,说明sId对应的房源不存在
            System.out.println("--------------找不到该房源--------------");
            return;
        }
        //不是null,就打印信息
        System.out.println("============你要找的房源信息============");
        System.out.println("编号\t姓名\t电话\t\t地址\t租金\t出租情况(已出租/未出租)");
        System.out.println(house);
    }

完成修改房屋信息的功能

  • 用到search方法根据id返回要修改信息的房源对象
  • 在HouseView里编写modifyHouse方法
public void modifyHouse() {
        System.out.println("==============修改房源信息==============");
        System.out.println("请输入你要修改的房源id(-1退出):");
        int mId = Utility.readInt();
        if (mId == -1){
            System.out.println("============退出修改房源信息============");
            return;
        }
        House house = houseService.search(mId);//传递sId给search,引用一个House对象名指向返回的房源对象
        if (house == null) {//对象为null,找不到
            System.out.println("--------------找不到该房源--------------");
            return;
        }
        //能找到就修改信息
        //这里用到Utility的方法,如果键盘输入的是回车,那么不修改信息,否则修改成输入的信息
        System.out.print("姓名(" + house.getName() + "):");
        house.setName(Utility.readString(4, house.getName()));
        System.out.print("电话(" + house.getPhone() + "):");
        house.setPhone(Utility.readString(11,house.getPhone()));
        System.out.print("地址(" + house.getAddress() + "):");
        house.setAddress(Utility.readString(10, house.getAddress()));
        System.out.print("月租(" + house.getRent() + "):");
        house.setRent(Utility.readInt(house.getRent()));
        System.out.print("状态(" + house.getState() + "):");
        house.setState(Utility.readString(3,house.getState()));
        System.out.println("================修改房源完成================");
    }

完整代码见houserent包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值