目录
一、项目需求
二、项目界面
三、思路分析
四、Utility工具类
五、House类
六、HouseView
七、HouseList
八、添加房屋信息
九、删除房屋信息
十、退出程序
十一、查找
十二、修改
退出程序
分层模式
在IDEA中分别创建package
主要功能:完成房屋出租项目需要用到的数据的输入
Utility类中的方法一览
TestUtility类
package com.hspedu.houserent.utils;
public class TestUtility {
public static void main(String[] args) {
String s1 = Utility.readString(3);//限制长度为3
System.out.println("s=" + s1);
//限制长度为10,如果直接回车,则默认s2="hspedu"
String s2 = Utility.readString(10, "hspedu");
System.out.println("s2=" + s2);
}
}
数据层:一个House对象代表一条房屋信息
首先判断House对象有哪些属性:从下图中可知主要有
编号、房主、电话、地址、月租、状态
以上几个属性
package com.hspedu.houserent.domain;
public class House {
private int id;
private String name;
private String phoNum;
private String address;
private int rent;
private String state;
public House(int id, String name, String phoNum, String address, int rent, String state) {
this.id = id;
this.name = name;
this.phoNum = phoNum;
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 getPhoNum() {
return phoNum;
}
public void setPhoNum(String phoNum) {
this.phoNum = phoNum;
}
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" + phoNum +
"\t" + address +
"\t" + rent +
"\t" + state;
}
}
化繁为简
实现功能三部曲:明确功能-->思路分析-->代码实现
mainMenu方法
package com.hspedu.houserentziji.houseview;
import com.hspedu.houserentziji.utils.Utility;
/**
*1.显示界面
* 2. 接收用户的输入
* 3. 调用HouseService 完成对房屋信息的各种操作
*/
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.print("请输入(1-6):");
key = Utility.readChar();
switch (key){
case '1':
//新增
break;
case '2':
//查找
break;
case '3':
//删除
break;
case '4':
//修改
break;
case '5':
//房屋列表
break;
case '6':
loop = false;
break;
}
}while(loop);
System.out.println("========退出了房屋出租系统========");
}
}
和零钱通的mianMenu方法模式相同
Service层
package com.hspedu.houserentziji.houseservice;
import com.hspedu.houserentziji.domain.House;
public class HouseService {
//用数组存储房屋信息,元素是House对象
//但是不能确定数组内有多少条房屋信息,即数组的长度
private House[] houses;
//通过构造器定义数组长度
public HouseService(int size) {
houses = new House[size];
//举例定义数组中的一个元素
houses[0] = new House(1,"jack","13505150925","浦东区141弄",3500,"未出租");
}
public House[] list(){
return houses;//直接返回一个数组
}
}
View层
//创建HouseService对象,这样就可以通过此对象调用HouseService类中的方法
private HouseService houseService = new HouseService(10);//定义数组长度
public void listHouses(){
System.out.println("--------房屋列表--------");
System.out.println("编号\t房主\t\t电话\t\t\t地址\t\t\t\t月租\t\t状态(未出租/已出租)");
House[] houses = houseService.list();//接收返回的数组
//循环遍历输出数组的每个元素,即每一条房屋信息
for (int i = 0; i < houses.length; i++) {
//增加判断条件,如果数组元素为null,则跳过不输出
if (houses[i] == null){
continue;//跳过但是并不是跳出整个for循环,老师用的break
}
System.out.println(houses[i]);
}
}
public void addHouse(){
System.out.println("--------添加房屋--------");
System.out.print("姓名:");
String name = Utility.readString(10);
System.out.print("电话:");
String phoNum = com.hspedu.houserent.utils.Utility.readString(15);
System.out.print("地址:");
String address = com.hspedu.houserent.utils.Utility.readString(30);
System.out.print("月租:");
int rent = com.hspedu.houserent.utils.Utility.readInt();
System.out.print("状态:");
String state = com.hspedu.houserent.utils.Utility.readString(3);
//编号采取自增模式
//将输入的数据创建成一条完成的房屋信息
House house = new House(0, name, phoNum, address, rent, state);
//然后通过调用HouseService中的add()方法,完成添加
if(houseService.add(house)){//如果返回真
System.out.println("--------添加完成--------");
}else{
System.out.println("--------存储空间已满,无法再添加");
}
}
private int houseNums = 1;//构造器中已经有一条房屋信息
private int idCounter = 1;//已经有了编号1
public boolean add(House newHouse){//将house改成newHouse,这样更明确且可以区分
//首先判断有没有空间添加
//1.添加HouseNums属性,记录房屋信息条数
//2.如果houseNums = houses.length,即数组已满,没有添加的空间,直接返回false
//3.如果还有空间,则进行添加
//id自增长问题,创建idCounter属性,添加成功后,房屋的编号也会自动+1,所以
if(houseNums == houses.length){
return false;
}
houses[houseNums++] = newHouse;
newHouse.setId(++idCounter);
return true;
}
延伸:如果把数组的长度设置为2,然后再新增房屋信息时,如果数组已满,对数组进行扩容
if(houseNums == houses.length){
//数组扩容
House[] houses1 = new House[houses.length+1];
for (int i = 0; i < houses.length; i++) {
houses1[i] = houses[i];
}
houses1[houseNums++] = newHouse;
houses = houses1;
newHouse.setId(++idCounter);
return true;
}
运行后没有问题
//删除功能
public void delHouse(){
System.out.println("--------删除房屋--------");
System.out.print("请选择带删除编号(-1退出):");
int delId = Utility.readInt();
if(delId == -1){
System.out.println("--------退出删除房屋功能--------");
return;//结束这个方法
}
System.out.print("确认是否删除(Y/N),请小心选择:");
char choice = Utility.readConfirmSelection();
if(choice == 'Y'){//完成删除操作
//如果返回的是true,就完成删除操作
if(houseService.del(delId)){
System.out.println("--------房屋信息删除成功--------");
}else{
//返回false,即编号不存在
System.out.println("----编号不存在,房屋信息删除失败----");
}
}else{
System.out.println("--------退出删除房屋功能--------");
}
}
public boolean del(int getId){
//首先判断id在数组中是否存在
int index = -1;
for (int i = 0; i < houseNums; i++) {
if(getId == houses[i].getId()){
index = i;
}
}
if(index == -1){//数组中没有找到
return false;
}
//找到之后,完成删除操作,并将数组元素依次前移
//houseNums-1,这样移动到倒数第二个元素后就会结束循环
for (int i = index; i < houseNums-1; i++) {
houses[i] = houses[i+1];
}
//将最后一个元素置空,并且houseNums-1
houses[--houseNums] = null;
return true;
}
public void exitHouse(){
System.out.print("确认是否退出(Y/N):");
char answer = Utility.readConfirmSelection();
if(answer == 'Y'){//这里必须是大写的Y,因为在上述方法中已经把输入的字母转化成大写的形式
loop = false;
}
}
//查找功能
//
public void findHouse(){
System.out.println("--------查找房屋--------");
System.out.print("请输入你要查找的房屋编号:");
int findID = Utility.readInt();
House house = houseService.find(findID);//接收返回的信息
if(house == null){
System.out.println("------你输入的编号不存在------");
return;//结束该方法
}
System.out.println(house);
}
public House find(int findId){
//首先查找是否存在该id
//返回条件必须是houseNums,如果是houses.length的话,假如只有一条房屋信息
//但是查找的时候findId为3,就会报NullPointerException
//原因:此时houses[1] = null
for (int i = 0; i < houseNums; i++) {
if(findId == houses[i].getId()){
return houses[i];
}
}
//如果循环结束,没有返回值的话,说明数组中没有该编号,返回null
return null;
}
//修改房屋信息,如果不想修改,直接回车即可
//思路分析:1.首先查找是否有此id
//2.如果没有,则返回null,无法修改
//3.如果有,则修改房屋信息
//老师代码:直接利用查找功能写的方法,得到返回的房屋信息,在此基础上进行修改
public void modifyHouse(){
System.out.println("--------修改房屋--------");
System.out.print("请选择待修改房屋编号(-1退出):");
int modId = Utility.readInt();
if(modId == -1){
System.out.println("--------退出修改房屋功能--------");
return;//结束这个方法
}
//根据输入的modId查找对象
House house = houseService.find(modId);
if(house == null){
System.out.println("------你输入的编号不存在,无法修改------");
return;//结束该方法
}
System.out.print("姓名(" + house.getName() + "):");
//如果直接回车,返回原来的值,这个问题没有想出解决办法
//给一个默认值"",即如果用户直接回车,name = "";
//String name = Utility.readString(10,"");
//进一步判断,如果name不是"",那么就利用set方法修改对象house的属性name
// if(!"".equals(name)){//!""是对""进行取反,即name是有内容的,不是空字符串
// house.setName(name);
// }
//第二种方法:如果回车的时候,默认值是house.getName
//即:如果用户有输入,就得到输入的结果,如果直接回车,返回的还是原来的name
//这样就不用判断,直接将结果通过set方法赋给name属性
String name = Utility.readString(10,house.getName());
house.setName(name);
System.out.print("电话(" + house.getPhoNum() + "):");
String phone = Utility.readString(15,house.getPhoNum());
house.setPhoNum(phone);
System.out.print("地址(" + house.getAddress() + "):");
String address = Utility.readString(30,house.getAddress());
house.setAddress(address);
System.out.print("月租(" + house.getRent() + "):");
int rent = Utility.readInt(house.getRent());
house.setRent(rent);
System.out.print("状态(" + house.getState() + "):");
String state = Utility.readString(3,house.getState());
house.setState(state);
System.out.println("--------修改完成--------");
}