代码在com.stulzl.houserent.包中

测试HouseRentApp

package com.stulzl.houserent.house_rent_app;

import com.stulzl.houserent.domain.House;
import com.stulzl.houserent.view.HouseView;

public class HouseRentApp {//这是一个调用各个对象功能的类
    public static void main(String[] args) {

        //创建HouseView对象,并显示主菜单,是整个程序的入口
        HouseView houseView = new HouseView();//创建一个房屋主页面的对象直接引用菜单
        houseView. mainMenu();
    }
}

House类

package com.stulzl.houserent.domain;

// House的对象表示一个房屋信息  364
public class House {
    //编号  房主  电话  地址  月租  状态(未出租/已出租)
    private int id;
    private String name;
    private String phone;
    private String address;
    private int rent;
    private String state;
    //构造器和set,get方法

    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;
    }
}

HouseService类,增删查改

package com.stulzl.houserent.service;

import com.stulzl.houserent.domain.House;


import java.util.Scanner;

//定义House[]数组 ,保存House对象
//1. 响应HouseView的调用
//2. 完成对房屋信息的各种操作(增删改查c[create]r[read]u[update]d[delete])
public class HouseService {//完成对各种房屋信息的各种操作和功能类

    Scanner scanner = new Scanner(System.in);
    private int houseNum=1;//记录房屋当前数量
    private int idCounter=1;//记录当前id增长到哪个值
    private House house[];//创建一个房屋数组用来存放每个房屋的信息,但是数组多大用构造器来赋值

    //构造器
    public HouseService(int size){
        house = new House[size];//给房屋数组空间大小了
        house[0]=new House(1,"jack","112","海淀区",2000,"未出租");//初始化
    }

    //查找id方法
    public int find(int delId){
        //应当先找到要删除的房屋信息对应的下标
        int index1 = -1;//记录下标
        for (int i = 0; i < houseNum; i++) {
            if(delId==house[i].getId()){
                index1=i;//记录下标
                return i;
            }
        }
        //说明要删除的房屋id不存在
        return -1;
    }
    
    //循环判断输入,必须输出Y/N
    public char readConfirmSelection(){
        char choice=' ';
        while(true){
            System.out.print("您确认要删除吗?确认Y  否则N:");
            choice = scanner.next().charAt(0);
            if(choice=='Y'||choice=='N'){
                break;
            }else{
                System.out.println("您的输入错误,请重新输入");
            }
        }
        return choice;
    }

    //String类型,判断用户有没有输入回车
    public String readString(){
        String input = scanner.nextLine();//读取用户输入的一行信息,如果用户不输入
                                         // 直接回车,则读取回车空信息
        if(input.length()==0){//用户没输入
            return input;//返回空信息
        }
        return input;//用户输入了信息,返回
    }

    //int类型,判断用户有没有输入回车
//    public int readInt(){
//       String input = scanner.nextLine();//nextLine()不能用int类型接收,我们只
                                           //好用String类型接收在强转
//        if(input.length()==0){//用户没输入,直接回车
//            return -1;
//        }
          //用户输入了
//        return Integer.parseInt(input);//将输入的String类型转换成为int类型
//    }

    //根据id修改房屋信息  371
    public void update(){
        System.out.println("=========修改房屋信息===========");
        System.out.println("请选择待修改的房屋编号(-1退出)");
        int updateId = scanner.nextInt();//用户输入id
        if(updateId==-1){
            System.out.println("==========放弃修改房屋信息===========");
            return;
        }
        //根据输入得到updateId,查找对象
        int index1 = find(updateId);
        if(index1==-1){
            System.out.println("=========修改的房屋信息不存在===========");
            return;
        }
        //存在
        System.out.print("姓名("+house[index1].getName()+"):");

        String deteleEnter = scanner.nextLine();//注意!!!!!,重中之重
                          //以为之前接受用户输入id时,使用了"回车"结束了78行的输入语句,
       // 但是我们第99行也就是下一行调用自己写的readString()时,这个方法里有nextLine()
       //会把结束输入id时的回车读走,直接影响readString()方法后续的代码,产生错误,所以我们提前在
       //二者之间写一个nextLine()读走那个留下来的回车,为readString()方法中的nextLine()
       //清除障碍,保证其后续代码的正确

        String name = readString();//这里如果用户直接回车表示不修改信息,默认为空""
        //这里解释,即使name为空了,他也进不去if,所以修改不了信息
        if(!"".equals(name)){//如果name不得空则修改,因为返回值是字符串类型所以不能用name!=""判断
            house[index1].setName(name);//修改更新新信息
        }

        System.out.print("电话(" + house[index1].getPhone() + "):");
        String phone = readString();
        if (!"".equals(phone)) {
            house[index1].setPhone(phone);
        }

        System.out.print("地址(" + house[index1].getAddress() + "): ");
        String address = readString();
        if (!"".equals(address)) {
            house[index1].setAddress(address);
        }

        System.out.print("租金(" + house[index1].getRent() + "):");

        String rent = readString();//这里虽然rent是int类型,但是我们就用String类型来操作
                            //等值传回来,我们将String类型通过Integer.parseInt(rent)方法
                            //强制转换为int类型
        if (!"".equals(rent)) {
            house[index1].setRent(Integer.parseInt(rent));
        }

        //如果理解不了强转,我还写了readInt()方法
//        int rent = readInt();
//        if(rent!=-1){
//            house[index1].setRent(rent);
//        }

        System.out.print("状态(" + house[index1].getState() + "):");
        String state = readString();
        if (!"".equals(state)) {
            house[index1].setState(state);
        }
        System.out.println("=============修改房屋信息成功============");
    }

    //根据id查找房屋信息  370
    public void findHouse(){
        System.out.println("=========查找房屋信息===========");
        System.out.print("请输入要查找的房屋id:");
        int findId = scanner.nextInt();
        //调用方法
        int index1 = find(findId);
        if(index1==-1){//没找到
            System.out.println("=========查找房屋信息id不存在===========");
        }else{//找到了
            System.out.println(house[index1]);
        }
    }

    //完成退出确认  369
    public boolean exit(){
               char c = readConfirmSelection();
        if(c=='Y'){
            return false;
        }
        return true;
    }

    //编写delHouse() 接收输入的id,调用Service 的del方法  368
    public void delHouse(){
        System.out.println("=========删除房屋信息===========");
        System.out.print("请输入待删除的房屋编号(-1退出):");
        int delId = scanner.nextInt();
        if(delId==-1){
            System.out.println("=========放弃删除房屋信息===========");
            return;//结束这个方法
        }
        //注意该方法本身就有循环判断的逻辑,必须输出Y/N
        char choice = readConfirmSelection();
        if(choice == 'Y'){
            int index1 = find(delId);//查找id
            if(index1==-1){
                System.out.println("=============房屋编号不存在,删除失败============");
            }else{
                //删除,将后面的元素向前移
                for (int i = index1; i < houseNum-1; i++) {
                    house[i]=house[i+1];
                }
                house[houseNum-1]=null;//把当前存在的元素最后面的位置置为空,因为元素都往前挪了,最后面那个位置肯定是空
                houseNum--;//既然删除了,肯定当前数组中房屋数量减1啊

                //序号也要减,后续id减1
                for (int i = index1; i < houseNum; i++) {
                    int s = (house[i].getId())-1;
                    house[i].setId(s);
                }
                idCounter--;//当前数组中房屋id减1
                System.out.println("=========删除房屋信息成功===========");
            }
        }else{
            System.out.println("=========放弃删除房屋信息===========");
        }
    }

    //增容
    public void addCapacity(){
        if(houseNum==house.length){//判断数组有没有满
            //扩容
            House houseNew[] = new House[house.length+2];//扩容创建一个新数组
            for (int i = 0; i <house.length; i++) {
                houseNew[i]=house[i];//将老数组信息拷贝到新数组
            }
            house=houseNew;//将扩容后的新数组指向老数组
            //System.out.println("扩容成功~");
        }
    }
    //编写addHouse() 接收输入,创建House对象,调用add方法   367
    public void addHouse(){
        System.out.println("=========添加房屋信息===========");
        System.out.print("姓名:");
        String name = scanner.next();
        System.out.print("电话:");
        String phone = scanner.next();
        System.out.print("地址:");
        String address = scanner.next();
        System.out.print("月租:");
        int rent = scanner.nextInt();
        System.out.print("状态:");
        String state = scanner.next();
        //创建一个新的House对象, id 我们让系统分配
        House newHouse = new House(0, name, phone, address, rent, state);
        addCapacity();//判断是否增容
        //添加newHouse对象,新增加一个房屋
        house[houseNum]=newHouse;
        houseNum++;//当前房屋数量++
        System.out.println("=========添加房屋信息成功===========");
        //设计一个id自增长机制,定义一个idCounter然后利用set方法设置id
        idCounter++;//当前房屋id++
        newHouse.setId(idCounter);

    }

    //编写listHouses()显示房屋列表  366
    public void listHouse(){
        System.out.println("=========房屋信息列表===========");
        System.out.println("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(未出租/已出租)");
        for (int i = 0; i < house.length; i++) {//遍历数组返回信息
            if(house[i]==null){
                break;
            }
            System.out.println(house[i]);
        }
        System.out.println("=========房屋信息列表显示完成===========");
    }
}

HouseView界面

package com.stulzl.houserent.view;

import com.stulzl.houserent.domain.House;
import com.stulzl.houserent.service.HouseService;

import java.util.Scanner;


//1. 显示界面   365
//2. 接收用户的输入
//3. 调用HouseService完成对房屋信息的各种操作
public class HouseView {//界面类,调用功能

    private boolean loop=true;//控制菜单循环
    private char key=' ';//接收用户输入
    private HouseService houseService = new HouseService(2);//设置数组大小为10

    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): ");

            Scanner scanner = new Scanner(System.in);
            char key = scanner.next().charAt(0);
            //key = Utility.readChar();//引入工具类,引入字符数输入
            switch(key){
                case '1':
                    houseService.addHouse();
                    break;
                case '2':
                   houseService.findHouse();
                    break;
                case '3':
                    houseService.delHouse();
                    break;
                case '4':
                    houseService.update();
                    break;
                case '5':
                    houseService.listHouse();
                    break;
                case '6':
                    loop=houseService.exit();
                    break;
            }
        }while(loop);
        System.out.println("=====您已经退出菜单系统=====");
    }
}