一、零钱通项目

1.1 项目开发流程说明

  1. 项目需求说明
    使用Java开发零钱通项目,可以完成收益入账,消费,查看明细,退出系统等功能。
  2. 项目的界面
    image.png
  3. 项目代码实现
    编写文件 SmallChangeSys.java 完成基本功能 (过程编程)
    提示:先使用过程编程,后面改成OOP版本,体会面向对象带来的好处
  4. 项目代码实现改进
    1. 用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n
    2. 在收益入账和消费时,判断金额是否合理,并给出相应的提示
    3. 将面向过程的代码修改成面向对象的方法,编写 SmallChangeSysOOP.java 类,并使用 SmallChangeSysApp.java 完成测试

1.2 开发步骤

  1. 化繁为简
    1. 先完成显式菜单,并可以选择菜单,输出相应的数据或完成退出功能
    2. 完成零钱通明细
    3. 完成收益入账
    4. 完成消费
    5. 代码改进 ```java package com.hspedu.smallchange;

import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;

public class SmallChangeSys {

  1. //化繁为简
  2. //1. 先完成显式菜单,并可以选择菜单,给出对应提示
  3. //2. 完成零钱通明细
  4. //3. 完成收益入账
  5. //4. 完成消费
  6. //5. 退出
  7. //6. 用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n
  8. //7. 在收益入账和消费时,判断金额是否合理,并给出相应的提示
  9. public static void main(String[] args) {
  10. //定义相关变量
  11. boolean loop = true;
  12. Scanner scanner = new Scanner(System.in);
  13. String key = "";
  14. //2. 完成零钱通明细
  15. //老韩思路,(1) 可以把收益入账和消费,保存到数组 (2) 可以使用对象 (3) 简单的话可以使用String拼接
  16. String details = "----------------零钱通明细----------------";
  17. //3. 完成收益入账
  18. //老韩思路,定义新的变量
  19. double money = 0;
  20. double balance = 0;
  21. Date date = null; // data 是 java.util.Date 类型,表示日期
  22. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //用于日期格式化
  23. //4.完成消费
  24. //老韩思路,定义新的变量,保存消费的项目
  25. String note = null;
  26. do {
  27. System.out.println("\n----------------零钱通菜单----------------");
  28. System.out.println("\t\t\t1 零钱通明细");
  29. System.out.println("\t\t\t2 收益入账");
  30. System.out.println("\t\t\t3 消 费");
  31. System.out.println("\t\t\t4 退 出");
  32. System.out.println("请选择(1-4): ");
  33. key = scanner.next();
  34. //使用switch 分支控制
  35. switch (key) {
  36. case "1":
  37. System.out.println(details);
  38. break;
  39. case "2":
  40. System.out.println("收益入账金额:");
  41. money = scanner.nextDouble();
  42. //money 的值范围应该校验 -> 等下完善
  43. //老师思路
  44. //找出 不正确 的金额条件,给出提示即可,直接break
  45. if (money <= 0) {
  46. System.out.println("收益入账金额需要大于0");
  47. break;
  48. }
  49. balance += money;
  50. //拼接收益入账信息到 details
  51. date = new Date(); //获取当前日期
  52. details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
  53. break;
  54. case "3":
  55. System.out.println("消费金额:");
  56. money = scanner.nextDouble();
  57. //余额校验 -> 等下完善
  58. //找出金额 不正确 的情况,给出提示即可,直接break
  59. if (money <= 0) {
  60. System.out.println("消费金额需要大于0");
  61. break;
  62. }
  63. if (money > balance) {
  64. System.out.println("消费金额不能大于现有余额" + balance);
  65. break;
  66. }
  67. System.out.println("请输入消费说明:");
  68. note = scanner.next();
  69. balance -= money;
  70. date = new Date(); //获取当前日期
  71. details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
  72. break;
  73. case "4":
  74. //用户输入4退出时,给出提示“你确定要退出吗?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入y或者n
  75. // 思路分析
  76. //(1) 定义一个变量choice,接收用户的输入
  77. //(2) 使用 while + break,来处理接收到输入时 y 或者 n
  78. //(3) 退出 while 后,再判断 choice 是 y 还是 n ,从而决定是否退出
  79. // 建议:一段代码,完成一个小功能,尽量不要混在一起
  80. String choice = "";
  81. while (true) { //要求用户必须输入 y/n 否则一直循环
  82. System.out.println("你确定要退出吗?y/n");
  83. choice = scanner.next();
  84. if ("y".equals(choice) || "n".equals(choice)) {
  85. break;
  86. }
  87. }
  88. //当退出了 while ,再进行判断
  89. if ("y".equals(choice)) {
  90. loop = false;
  91. }
  92. break;
  93. default:
  94. System.out.println("选择有误,请重新选择");
  95. }
  96. } while (loop);
  97. System.out.println("\n--------退出了零钱通项目--------");
  98. }

}

  1. OPP(面向对象编程)版本
  2. ```java
  3. package com.hspedu.smallchange.oop_;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.Scanner;
  7. /**
  8. * 该类是完成零钱通的各个功能的类
  9. * 使用OOP(面向对象编程)完成
  10. * 将各个功能对应一个方法
  11. */
  12. public class SmallChangeSysOOP {
  13. //属性
  14. boolean loop = true;
  15. Scanner scanner = new Scanner(System.in);
  16. String key = "";
  17. String details = "----------------零钱通明细----------------";
  18. double money = 0;
  19. double balance = 0;
  20. Date date = null; // data 是 java.util.Date 类型,表示日期
  21. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //用于日期格式化
  22. String note = null;
  23. //1. 先完成显式菜单,并可以选择菜单
  24. public void mainMenu() {
  25. do {
  26. System.out.println("\n----------------零钱通菜单(OOP)----------------");
  27. System.out.println("\t\t\t1 零钱通明细");
  28. System.out.println("\t\t\t2 收益入账");
  29. System.out.println("\t\t\t3 消 费");
  30. System.out.println("\t\t\t4 退 出");
  31. System.out.println("请选择(1-4): ");
  32. key = scanner.next();
  33. //使用switch 分支控制
  34. switch (key) {
  35. case "1":
  36. this.detail();
  37. break;
  38. case "2":
  39. this.income();
  40. break;
  41. case "3":
  42. this.pay();
  43. break;
  44. case "4":
  45. this.exit();
  46. break;
  47. default:
  48. System.out.println("选择有误,请重新选择");
  49. }
  50. } while (loop);
  51. }
  52. //2. 完成零钱通明细
  53. public void detail() {
  54. System.out.println(details);
  55. }
  56. //3. 完成收益入账
  57. public void income() {
  58. System.out.println("收益入账金额:");
  59. money = scanner.nextDouble();
  60. if (money <= 0) {
  61. System.out.println("收益入账金额需要大于0");
  62. return; //退出方法,不再执行后面的代码
  63. }
  64. balance += money;
  65. date = new Date(); //获取当前日期
  66. details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
  67. }
  68. //4. 完成消费
  69. public void pay() {
  70. System.out.println("消费金额:");
  71. money = scanner.nextDouble();
  72. //余额校验 -> 等下完善
  73. //找出金额 不正确 的情况,给出提示即可,直接break
  74. if (money <= 0) {
  75. System.out.println("消费金额需要大于0");
  76. return;
  77. }
  78. if (money > balance) {
  79. System.out.println("消费金额不能大于现有余额" + balance);
  80. return;
  81. }
  82. System.out.println("请输入消费说明:");
  83. note = scanner.next();
  84. balance -= money;
  85. date = new Date(); //获取当前日期
  86. details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t余额:" + balance;
  87. }
  88. //5. 完成退出
  89. public void exit() {
  90. String choice = "";
  91. while (true) { //要求用户必须输入 y/n 否则一直循环
  92. System.out.println("你确定要退出吗?y/n");
  93. choice = scanner.next();
  94. if ("y".equals(choice) || "n".equals(choice)) {
  95. break;
  96. }
  97. }
  98. //当退出了 while ,再进行判断
  99. if ("y".equals(choice)) {
  100. loop = false;
  101. }
  102. }
  103. }
  1. package com.hspedu.smallchange.oop_;
  2. /**
  3. * 这里我们直接调用SmallChangeSysOOP对象,显示主菜单即可
  4. */
  5. public class SmallChangeSysApp {
  6. public static void main(String[] args) {
  7. SmallChangeSysOOP smallChangeSysOOP = new SmallChangeSysOOP();
  8. smallChangeSysOOP.mainMenu();
  9. }
  10. }

二、房屋出租系统

2.1 项目需求说明

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

2.2 项目界面

  1. 主菜单
    image.png
  2. 新增房源
    image.png
  3. 查找房源
    image.png
  4. 删除房源
    image.png
  5. 修改房源
    如果不希望修改某个信息,直接回车即可
    image.png
  6. 房屋列表
    image.png
  7. 退出系统
    image.png

2.3 项目设计 - 程序框架图

分层模式 => 当软件比较复杂,需要模式管理
框架图的作用:

  1. 系统有哪些类【文件】
  2. 类与类的调用关系

第一阶段实战项目 - 图9

2.4 项目设计 - 工具类引入

  1. 搭建本地目录结构
    com.hspedu.houserent //包名
    |—-view //界面类文件夹
    |—-service //业务类文件夹
    |—-domain //domain类文件夹
    |—-utils //工具类文件夹
    |—-HouseRentApp.java //程序入口文件

  2. 工具类的引入和使用案例
    |—-view
    |—-service
    |—-domain
    |—-utils
    |—-Utility.java
    |—-HouseRentApp.java

  1. package com.hspedu.houserent.utils;
  2. /**
  3. 工具类的作用:
  4. 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
  5. */
  6. import java.util.*;
  7. /**
  8. */
  9. public class Utility {
  10. //静态属性。。。
  11. private static Scanner scanner = new Scanner(System.in);
  12. /**
  13. * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
  14. * @return 1——5
  15. */
  16. public static char readMenuSelection() {
  17. char c;
  18. for (; ; ) {
  19. String str = readKeyBoard(1, false);//包含一个字符的字符串
  20. c = str.charAt(0);//将字符串转换成字符char类型
  21. if (c != '1' && c != '2' &&
  22. c != '3' && c != '4' && c != '5') {
  23. System.out.print("选择错误,请重新输入:");
  24. } else break;
  25. }
  26. return c;
  27. }
  28. /**
  29. * 功能:读取键盘输入的一个字符
  30. * @return 一个字符
  31. */
  32. public static char readChar() {
  33. String str = readKeyBoard(1, false);//就是一个字符
  34. return str.charAt(0);
  35. }
  36. /**
  37. * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
  38. * @param defaultValue 指定的默认值
  39. * @return 默认值或输入的字符
  40. */
  41. public static char readChar(char defaultValue) {
  42. String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
  43. return (str.length() == 0) ? defaultValue : str.charAt(0);
  44. }
  45. /**
  46. * 功能:读取键盘输入的整型,长度小于2位
  47. * @return 整数
  48. */
  49. public static int readInt() {
  50. int n;
  51. for (; ; ) {
  52. String str = readKeyBoard(2, false);//一个整数,长度<=2位
  53. try {
  54. n = Integer.parseInt(str);//将字符串转换成整数
  55. break;
  56. } catch (NumberFormatException e) {
  57. System.out.print("数字输入错误,请重新输入:");
  58. }
  59. }
  60. return n;
  61. }
  62. /**
  63. * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
  64. * @param defaultValue 指定的默认值
  65. * @return 整数或默认值
  66. */
  67. public static int readInt(int defaultValue) {
  68. int n;
  69. for (; ; ) {
  70. String str = readKeyBoard(10, true);
  71. if (str.equals("")) {
  72. return defaultValue;
  73. }
  74. //异常处理...
  75. try {
  76. n = Integer.parseInt(str);
  77. break;
  78. } catch (NumberFormatException e) {
  79. System.out.print("数字输入错误,请重新输入:");
  80. }
  81. }
  82. return n;
  83. }
  84. /**
  85. * 功能:读取键盘输入的指定长度的字符串
  86. * @param limit 限制的长度
  87. * @return 指定长度的字符串
  88. */
  89. public static String readString(int limit) {
  90. return readKeyBoard(limit, false);
  91. }
  92. /**
  93. * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
  94. * @param limit 限制的长度
  95. * @param defaultValue 指定的默认值
  96. * @return 指定长度的字符串
  97. */
  98. public static String readString(int limit, String defaultValue) {
  99. String str = readKeyBoard(limit, true);
  100. return str.equals("")? defaultValue : str;
  101. }
  102. /**
  103. * 功能:读取键盘输入的确认选项,Y或N
  104. * 将小的功能,封装到一个方法中.
  105. * @return Y或N
  106. */
  107. public static char readConfirmSelection() {
  108. System.out.println("请输入你的选择(Y/N)");
  109. char c;
  110. for (; ; ) {//无限循环
  111. //在这里,将接受到字符,转成了大写字母
  112. //y => Y n=>N
  113. String str = readKeyBoard(1, false).toUpperCase();
  114. c = str.charAt(0);
  115. if (c == 'Y' || c == 'N') {
  116. break;
  117. } else {
  118. System.out.print("选择错误,请重新输入:");
  119. }
  120. }
  121. return c;
  122. }
  123. /**
  124. * 功能: 读取一个字符串
  125. * @param limit 读取的长度
  126. * @param blankReturn 如果为true ,表示 可以读空字符串。
  127. * 如果为false表示 不能读空字符串。
  128. *
  129. * 如果输入为空,或者输入大于limit的长度,就会提示重新输入。
  130. * @return
  131. */
  132. private static String readKeyBoard(int limit, boolean blankReturn) {
  133. //定义了字符串
  134. String line = "";
  135. //scanner.hasNextLine() 判断有没有下一行
  136. while (scanner.hasNextLine()) {
  137. line = scanner.nextLine();//读取这一行
  138. //如果line.length=0, 即用户没有输入任何内容,直接回车
  139. if (line.length() == 0) {
  140. if (blankReturn) return line;//如果blankReturn=true,可以返回空串
  141. else continue; //如果blankReturn=false,不接受空串,必须输入内容
  142. }
  143. //如果用户输入的内容大于了 limit,就提示重写输入
  144. //如果用户如的内容 >0 <= limit ,我就接受
  145. if (line.length() < 1 || line.length() > limit) {
  146. System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
  147. continue;
  148. }
  149. break;
  150. }
  151. return line;
  152. }
  153. }
  1. package com.hspedu.houserent.utils;
  2. public class TestUtility {
  3. public static void main(String[] args) {
  4. //这时一个测试类,使用完毕就删除了
  5. //要求输入一个字符串,长度最大为3
  6. String s = Utility.readString(3);
  7. System.out.println("s=" + s);
  8. //要求输入一个字符串,长度最大为10,如果用户直接回车,就给一个默认值
  9. String s1 = Utility.readString(10, "hspedu");
  10. System.out.println("s1 = " + s1);
  11. //解释
  12. //这里直接使用了 类.方法() => 因为当一个方法是static时,就是一个静态方法
  13. //注意:静态方法可以直接通过类名调用
  14. }
  15. }

2.5 项目功能实现 - 完成House类

|—-view
|—-service
|—-domain
|—-House.java
|—-utils
|—-Utility.java
|—-HouseRentApp.java

编号 房主 电话 地址 月租 状态(已出租/未出租)

  1. package com.hspedu.houserent.domain;
  2. /**
  3. * House 的对象表示一个 房屋的信息
  4. */
  5. public class House {
  6. //编号 房主 电话 地址 月租 状态(未出租/已出租)
  7. private int id;
  8. private String name;
  9. private String phone;
  10. private String address;
  11. private int rent;
  12. private String state;
  13. //构造器
  14. public House(int id, String name, String phone, String address, int rent, String state) {
  15. this.id = id;
  16. this.name = name;
  17. this.phone = phone;
  18. this.address = address;
  19. this.rent = rent;
  20. this.state = state;
  21. }
  22. //为了方便的输出对象信息,我们重写 toString
  23. @Override
  24. public String toString() {
  25. return id +
  26. "\t\t" + name +
  27. "\t" + phone +
  28. "\t\t" + address +
  29. "\t" + rent +
  30. "\t" + state ;
  31. }
  32. //set() 和 get() 方法
  33. public int getId() {
  34. return id;
  35. }
  36. public void setId(int id) {
  37. this.id = id;
  38. }
  39. public String getName() {
  40. return name;
  41. }
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45. public String getPhone() {
  46. return phone;
  47. }
  48. public void setPhone(String phone) {
  49. this.phone = phone;
  50. }
  51. public String getAddress() {
  52. return address;
  53. }
  54. public void setAddress(String address) {
  55. this.address = address;
  56. }
  57. public int getRent() {
  58. return rent;
  59. }
  60. public void setRent(int rent) {
  61. this.rent = rent;
  62. }
  63. public String getState() {
  64. return state;
  65. }
  66. public void setState(String state) {
  67. this.state = state;
  68. }
  69. }

2.6 项目功能实现 - 显示主菜单和完成退出功能

说明:实现功能的三部曲【明确功能 -> 思路分析 -> 代码实现】

  1. 功能说明
    用户打开软件,可以看到主界面,可以退出软件

  2. 思路分析
    在 HouseView.java 中,编写一个方法 mainMenu,显示菜单

  3. 代码实现 ```java package com.hspedu.houserent.view;

import com.hspedu.houserent.utils.Utility;

/**

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

    private boolean loop = true; //控制显示菜单 private char key = ‘ ‘; //接收用户选择

    //显示主菜单 public void mainMenu() {

    1. do {
    2. System.out.println("---------------房屋出租系统---------------");
    3. System.out.println("\t\t\t1 新 增 房 源");
    4. System.out.println("\t\t\t2 查 找 房 屋");
    5. System.out.println("\t\t\t3 删 除 房 屋");
    6. System.out.println("\t\t\t4 修 改 房 屋 信 息");
    7. System.out.println("\t\t\t5 房 屋 列 表");
    8. System.out.println("\t\t\t6 退 出");
    9. System.out.println("请输入你的选择(1-6): ");
    10. key = Utility.readChar();
    11. switch (key) {
    12. case '1':
    13. System.out.println("新增");
    14. break;
    15. case '2':
    16. System.out.println("查找");
    17. break;
    18. case '3':
    19. System.out.println("删除");
    20. break;
    21. case '4':
    22. System.out.println("修改");
    23. break;
    24. case '5':
    25. System.out.println("列表");
    26. break;
    27. case '6':
    28. System.out.println("退出");
    29. loop = false;
    30. break;
    31. }
    32. } while (loop);

    } } ```

2.7 项目功能实现 - 显示房屋列表

  1. 功能说明
    image.png

  2. 思路分析
    需要编写HouseView.java 和 HouseService.java

  3. 代码实现 ```java //编写 HouseView.java 加入如下内容 private HouseService houseService = new HouseService(10); //设置数组的大小为10

//编写listHouse()显示房屋列表 public void listHouse() { System.out.println(“\n————————-房屋列表————————-“); System.out.println(“编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态”); House[] houses = houseService.list(); //得到所有房屋 for (int i = 0; i < houses.length; i++) { if (houses[i] != null) { System.out.println(houses[i]); } } System.out.println(“\n——————-房屋列表显示完毕——————-“); }

//在显示主菜单中 switch(key) 修改内容如下 case ‘5’: listHouse(); break;

  1. ```java
  2. //编写 HouseService 文件
  3. package com.hspedu.houserent.service;
  4. import com.hspedu.houserent.domain.House;
  5. /**
  6. * HouseService.java <=> 类【业务层】
  7. * //定义House[]数组,保存House对象
  8. * 1. 相应HouseView的调用
  9. * 2. 完成对房屋信息的各种操作
  10. * c(creat) r(read) u(update) d(delete)
  11. */
  12. public class HouseService {
  13. private House[] houses; //保存House对象
  14. public HouseService(int size) {
  15. houses = new House[size]; //当创建HouseService对象,指定数组大小
  16. //为了配合测试列表信息,这里初始化一个House对象
  17. houses[0] = new House(1,"Javk","112","浦东区",1000,"未出租");
  18. }
  19. //list方法,返回houses
  20. public House[] list() {
  21. return houses;
  22. }
  23. }

2.8 项目功能实现 - 添加房屋信息

  1. 功能说明
    image.png

  2. 思路分析
    HouseView.java 中添加 addHouse() 方法,用于显示添加房屋界面
    HouseService.java 中添加 add() 方法,用于将新的House对象加入到数组中

  3. 代码实现 ```java //编写 addHouse() 接收输入,创建 House 对象,调用add方法 public void addHouse() {

    1. System.out.println("\n-----------------添加房屋-----------------");
    2. System.out.print("姓名:");
    3. String name = Utility.readString(8);
    4. System.out.print("电话:");
    5. String phone = Utility.readString(12);
    6. System.out.print("地址:");
    7. String address = Utility.readString(16);
    8. System.out.print("月租:");
    9. int rent = Utility.readInt();
    10. System.out.print("状态:");
    11. String state = Utility.readString(3);
    12. //创建一个新的对象,注意 id是系统分配的,用户不能输入
    13. House house = new House(0, name, phone, address, rent, state);
    14. if (houseService.add(house)) {
    15. System.out.println("\n-----------------添加完成-----------------");
    16. } else {
    17. System.out.println("\n-----------------添加失败-----------------");
    18. }

    }

//在显示主菜单中 switch(key) 修改内容如下 case ‘1’: addHouse(); break;

  1. ```java
  2. //编写 HouseService.java
  3. //add方法,添加新对象,返回boolean
  4. public boolean add(House newHouse) {
  5. //判断是否还可以继续添加(暂时不考虑数组扩容问题)
  6. if (houseNums == houses.length) { //不能再添加
  7. System.out.println("数组已满,不能再添加了...");
  8. return false;
  9. }
  10. //把newHouse对象加入到房屋队列最后面
  11. houses[houseNums++] = newHouse;
  12. //我们程序员还要设计一个id自增长的机制,然后更新 newHouse的id
  13. newHouse.setId(++idCounter);
  14. return true;
  15. }

2.9 项目功能实现 - 删除房屋信息

  1. 功能说明
    image.png

  2. 思路分析
    需要编写 HouseView 和 HouseService

  3. 代码实现 ```java //编写 HouseView.java //编写delHouse() 接收输入的id,调用 Service 的 del() 方法 public void delHouse() {

    1. System.out.println("\n-----------------删除房屋-----------------");
    2. System.out.println("请输入待删除房屋的编号(-1退出):");
    3. int delId = Utility.readInt();
    4. if (delId == -1) {
    5. System.out.println("-------------放弃删除房屋信息-------------");
    6. return;
    7. }
    8. //注意该方法本身就有循环的逻辑,必须输入Y/N
    9. char chioce = Utility.readConfirmSelection();
    10. if (chioce == 'Y') {
    11. if (houseService.del(delId)) {
    12. System.out.println("\n-----------------删除成功-----------------");
    13. } else {
    14. System.out.println("房屋编号不存在,删除失败!");
    15. }
    16. } else {
    17. System.out.println("-------------放弃删除房屋信息-------------");
    18. return;
    19. }

    }

//在显示主菜单中 switch(key) 修改内容如下 case ‘3’: delHouse(); break;

  1. ```java
  2. //编写 HouseService.java
  3. //del方法,删除一个房屋的信息
  4. public boolean del(int delId) {
  5. //应当先找到要删除的房屋信息对应的下标
  6. //房屋的编号和下标不是一回事
  7. int index = -1;
  8. for (int i = 0; i < houseNums; i++) {
  9. if (delId == houses[i].getId()) { //要删除的房屋(id),是数组下标为i的元素
  10. index = i; //就使用index记录i
  11. }
  12. }
  13. if (index == -1) { //说明delId 在数组中不存在
  14. return false;
  15. }
  16. //如果找到
  17. for (int i = 0; i < houseNums - 1; i++) {
  18. houses[i] = houses[i + 1];
  19. }
  20. houses[--houseNums] = null;
  21. return true;
  22. }
  23. //在显示主菜单中 switch(key) 修改内容如下
  24. case '3':
  25. delHouse();
  26. break;

2.10 项目功能实现 - 完善退出确认功能

  1. 功能说明
    要求在退出时提示“确认是否退出(Y/N): ”,必须输入Y/N,否则循环提示

  2. 思路分析
    需要编写 HouseView

  3. 代码实现 ```java //编写HouseView //完善退出功能 ,加入退出确认方法 public void exitConfirm() {

    1. System.out.println("确认是否退出(Y/N):");
    2. char c;
    3. for (; ; ) {//无限循环
    4. String str = Utility.readKeyBoard(1, false).toUpperCase();
    5. c = str.charAt(0);
    6. if (c == 'Y' || c == 'N') {
    7. break;
    8. } else {
    9. System.out.print("选择错误,请重新输入:");
    10. }
    11. }
    12. if (c == 'Y') {
    13. loop = false;
    14. }

    }

//在显示主菜单中 switch(key) 修改内容如下 case ‘6’: exitConfirm(); break;

  1. <a name="eFx4a"></a>
  2. #### 2.11 项目功能实现 - 查找房屋
  3. 1. 功能说明<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12677686/1631176707622-47bbf43c-fa00-4230-bd3f-da74145b21a2.png#clientId=u08d2f56f-eb11-4&from=paste&height=207&id=XEmE8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=254&originWidth=615&originalType=binary&ratio=1&size=107739&status=done&style=none&taskId=u214b6646-85f3-45d7-a983-aaff0345f9a&width=500)
  4. 1. 思路分析
  5. 1. HouseView.java 中编写 findHouse(),用于显示查找房屋界面
  6. 1. HouseService 中编写方法findById(int findId);返回House对象如果没有,返回null
  7. 3. 代码实现
  8. ```java
  9. //编写 HouseView 文件
  10. //编写 findHouse,实现查找房屋
  11. public void findHouse() {
  12. System.out.println("\n-----------------查找房屋-----------------");
  13. System.out.print("请输入要查找的id:");
  14. int findId = Utility.readInt();
  15. House house = houseService.findById(findId);
  16. if (house != null) {
  17. System.out.println(house);
  18. } else {
  19. System.out.println("\n----------------没有该房屋----------------");
  20. }
  21. }
  22. //在显示主菜单中 switch(key) 修改内容如下
  23. case '2':
  24. findHouse();
  25. break;
  1. //编写 HouseService 文件
  2. //find() 方法,查找一个房屋的信息
  3. public House findById(int findId) {
  4. //遍历数组
  5. for (int i = 0; i < houseNums; i++) {
  6. if (findId == houses[i].getId()) {
  7. return houses[i];
  8. }
  9. }
  10. return null;
  11. }

2.12 项目功能实现 - 修改房屋信息

  1. 功能说明
    image.png

  2. 思路分析

HouseView.java 中编写updateHouse(),显示修改房屋界面

  1. 代码实现 ```java //编写 updateHouse(),实现修改房屋信息 public void updateHouse() {
    1. System.out.println("\n---------------修改房屋信息---------------");
    2. System.out.print("请选择待修改房屋编号(-1退出):");
    3. int updateId = Utility.readInt();
    4. if (updateId == -1) {
    5. System.out.println("---------------放弃修改房屋信息---------------");
    6. return;
    7. }
    8. House house = houseService.findById(updateId);
    9. if (house != null) {
    10. System.out.print("姓名(" + house.getName() + "): ");
    11. String name = Utility.readString(8,"");
    12. if (!"".equals(name)) {
    13. house.setName(name);
    14. }
    15. System.out.print("电话(" + house.getPhone() + "): ");
    16. String phone = Utility.readString(12,"");
    17. if (!"".equals(phone)) {
    18. house.setPhone(phone);
    19. }
    20. System.out.print("地址(" + house.getAddress() + "): ");
    21. String address = Utility.readString(16,"");
    22. if (!"".equals(address)) {
    23. house.setAddress(address);
    24. }
    25. System.out.print("月租(" + house.getRent() + "): ");
    26. int rent = Utility.readInt(-1);
    27. if (rent != -1) {
    28. house.setRent(rent);
    29. }
    30. System.out.print("状态(" + house.getState() + "): ");
    31. String state = Utility.readString(3,"");
    32. if (!"".equals(state)) {
    33. house.setState(state);
    34. }
    35. System.out.println("\n-----------------修改完成-----------------");
    36. } else {
    37. System.out.println("\n----------------没有该房屋----------------");
    38. }
    }

//在显示主菜单中 switch(key) 修改内容如下 case ‘4’: updateHouse(); break; ```

学习参考(致谢):

  1. B站 @程序员鱼皮 Java学习一条龙
  2. B站 @韩顺平 零基础30天学会Java