一 项目需求说明
实现基于文本界面的《房屋出租软件》。
能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表。
1 项目界面
(1)主界面
(2)新增房源
(3)查找房源
(4)删除房屋
(5) 修改房屋信息
(6)房屋列表
(7)退出
二 房屋租赁程序框架图
三 系统实现
1 完成House类
编号 房主 电话 地址 月租 状态(未出租/出租)
/**
* House对象表示一个房屋信息
*/
public class House {
//编号 房主 电话 地址 月租 状态(未出租/出租)
private int id;
private String name;
private String tel;
private String address;
rivate int rent;
private String state;
//构造器 和 getter、setter
public House(int id, String name, String tel, String address, int rent, String state) {
this.id = id;
this.name = name;
this.tel = tel;
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 getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
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" + name + "\t" + tel + "\t"
+ address + "\t" + rent + "\t" + state;
}
}
2 显示主菜单和完成退出软件的功能
化繁为简(一个一个的实现功能)
在HouseView类中编写mainMenu方法,显示主菜单。
public class HouseView {
private boolean loop = true; //控制显示菜单
private char key = ' ';//接受用户选择
public void mainMenu(){
do {
System.out.println("-------------房屋出租系统-------------");
System.out.println("\t\t1 新 增 房 源");
System.out.println("\t\t2 查 找 房 屋");
System.out.println("\t\t3 删 除 房 屋");
System.out.println("\t\t4 修 改 房 屋 信 息");
System.out.println("\t\t5 房 屋 列 表");
System.out.println("\t\t6 退 出");
System.out.println("请输入你的选择(1-6)");
key = Utility.readChar();
switch (key){
case '1':
System.out.println("新 增 房 源");
break;
case '2':
System.out.println("查 找 房 屋");
break;
case '3':
System.out.println("删 除 房 屋");
break;
case '4':
System.out.println("修 改 房 屋 信 息");
break;
case '5':
System.out.println("房 屋 列 表");
break;
case '6':
System.out.println("退 出");
loop = false;
break;
}
}while (loop);
}
}
3 完成显示房屋列表的功能
在HouseService添加:
① 添加House数组(用于存放房屋信息);
② 添加构造方法
③ 添加list方法,返回House数组
private House[] houses;
public HouseService(int size){
//new houses
houses = new House[size];
//测试新建house对象
houses[0] = new House(1,"li","123","hebei",2000,"weichuzhu");
}
//list方法,返回houses数组
public House[] list() {
return houses;
}
在HouseView添加:
① 添加listHouses方法,显示房屋信息;
② 将listHouses方法写在循环当中。
//编写listHouses()显示房屋列表
public void listHouses(){
System.out.println("-------------------房屋列表--------------------");
System.out.println("编号\t房主\t电话\t地址\t月租\t状态(未出租/出租)");
House[] houseList = houseService.list();
for (int i = 0; i < houseList.length ; i++) {
if (houseList[i] == null) {//如果空(没信息),不进行输出
break;
}
System.out.println(houseList[i]);
}
System.out.println();
}
4 添加房屋信息的功能
在HouseService添加:
① 添加add方法;
② 添加houseNums和idCounter属性
private int houseNums = 1;//记录当前有几个房屋信息
private int idCounter = 1;//记录当前的id增长到哪个值
public boolean add(House newHouse){
//考虑是否可以继续添加(暂不考虑数组扩容)
if (houseNums == houses.length){//房屋信息满了
System.out.println("房屋信息已满,无法再进行添加");
return false;
}
houses[houseNums++] = newHouse;//先加房屋元素,再自增
newHouse.setId(++idCounter);//先自增,再修改id
return true;
}
private int houseNums = 1;//记录当前有几个房屋信息
private int idCounter = 1;//记录当前的id增长到哪个值
public boolean add(House newHouse){//扩容版本
//考虑是否可以继续添加(暂不考虑数组扩容)
if (houseNums == houses.length){//房屋信息满了
System.out.println("房屋信息已满,无法再进行添加,进行扩容");
House[] newHouses = new House[houseNums];
for (int i = 0; i < houses.length; i++) {
newHouses[i] = houses[i];
}
houses = new House[houseNums + 1];
for (int i = 0; i < newHouses.length; i++) {
houses[i] = newHouses[i];
}
houses[houseNums++] = newHouse;//先加房屋元素,再自增
newHouse.setId(++idCounter);//先自增,再修改id
return false;
}
houses[houseNums++] = newHouse;//先加房屋元素,再自增
newHouse.setId(++idCounter);//先自增,再修改id
return true;
}
在HouseView添加:
① 添加addHouse方法
public void addHouse(){
System.out.println("-------------------添加房屋--------------------");
System.out.print("姓名:");
String name = Utility.readString(8);
System.out.print("电话:");
String tel = 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 newHouse =new House(0,name,tel,address,rent,state);
if (houseService.add(newHouse)){
System.out.println("-------------------添加房屋成功--------------------");
}else {
System.out.println("-------------------添加房屋失败--------------------");
}
}
5 完成删除房屋信息的功能
在HouseService添加:
① del(int delId);完成真正的删除任务,返回一个boolean
//del方法,删除一个房屋信息
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) {//说明delId在数组中不存在(有点绕..)
return false;
}
//如果找到
for(int i = index; i < houseNums - 1; i++) {
houses[i] = houses[i+1];
}
//把当有存在的房屋信息的最后一个 设置null
houses[--houseNums] = null;
return true;
}
在HouseView添加:
① delHouse();接受用户输入id
//编写delHouse类,接受用户输入id
public void delHouse(){
System.out.println("-------------------删除房屋--------------------");
System.out.print("请选择待删除房屋编号(-1退出)");
int delId = Utility.readInt();
if (delId == -1){
System.out.println("-----------------放弃删除房屋------------------");
return;
}
System.out.println("确认是否删除(Y/N),请小心选择:");
//该方法本身就有循环逻辑,不输入Y/N就出不来
char choice = Utility.readConfirmSelection();
if (choice == 'Y'){
houseService.del(delId);
}else {
System.out.println("-----------------放弃删除房屋------------------");
return;
}
if (houseService.del(delId)){
System.out.println("-----------------成功删除房屋------------------");
}else {
System.out.println("--------------未找到该房屋,删除失败-------------");
}
}
6 完善退出确认功能
在HouseView添加:
① 添加exit方法
//完成退出确认
public void exit() {
//这里我们使用Utility提供方法,完成确认
char c = Utility.readConfirmSelection();
if (c == 'Y') {
loop = false;
}
}
7 查找房屋信息功能
在HouseView添加:
① 添加findHouse方法
//根据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不存在============");
}
}
在HouseView添加:
① 添加findById方法
//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;
}
8 完成房屋修改的功能
在HouseView添加:
① 添加updateHouse方法
//根据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("=============修改房屋信息成功============");
}
知识点
1 静态方法的调用
静态方法可以直接通过类名调用
其中cry()方法可以直接A.cry()调用,而hi方法只能通过创建对象来调用。
class A{
public void hi(){ }
public static void cry(){ }//静态方法
}