记录学习过程,有不足请指出
跟韩顺平老师学该项目
项目需求
实现基于文本界面的《房屋出租软件》
能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表
项目界面
主菜单
新增房源
查找房源
删除房源
修改房源
房源列表
退出系统
项目设计
当软件比较复杂,需要分层管理
项目实现
明确功能 -> 思路分析 -> 代码实现
准备工具类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("================修改房源完成================");
}