电话本项目 - 图1

编码规范

电话本项目 - 图2

类中方法的实现

TelNodeRegex类(对输入的菜单选项验证)

正则表达式:对输入信息进行校验

1、正则表达式API查询:Pattern
2、代码实现(maches方法实现校验匹配)
_/**<br /> * 对输入信息进行校验方法<br /> */<br />_public String inoutValidate() {<br /> //定义正则表达式<br /> String regex = "";<br /> //创建Scanner对象
//在此处实例化Scanner对象,局部变量比成员变量周期短,这块用完Scanner对象就回收,不会占用内存<br /> Scanner scanner = new Scanner(System._in_);<br /> //死循环进行校验,直到输出正确,返回String值(个人理解此处的return相当于break)<br /> while (true) {<br /> //提示输入信息<br /> System._out_.println("请输入...");<br /> //键盘输入<br /> String nextPut = scanner.nextLine();<br /> //校验<br /> if (nextPut.matches(regex)) {<br /> return nextPut;<br /> } else {<br /> System._out_.println("请重新输入...");<br /> }<br /> }<br />}
3、菜鸟雷区:

  • 在while(true)死循环中,break和return返回值(void就直接return;)功能是一样的,但是if判断的时候,符合条件的话,要把你输入的地址显 示出来,所以要返回一个input。
  • 先break再return是可以的,但是代码赘余了,因为两句作用一样。

    App类(程序运行主窗口)

    1、start方法:

  • 实例化Menu类,TelNodeRegex类,Operate类

  • 打印Menu主菜单—->菜单项校验—->(while死循环可以一直执行该窗口)通过Switch执行菜单项对应Operate业务逻辑方法

2、main方法:

  • 程序入口

    Menu类(打印菜单)

    Person类(存放用户信息)

    @override toString方法(打印信息)

    String和StringBuffer在拼接字符串中的使用:

    | 字符串名称: | String | StringBuffer | | —- | —- | —- | | 使用的不同点: | 不可变字符序列 | 可变字符序列 | | | String每拼接一个都会再常量池查找,常量池没有就会创建新对象,这样会创建大量的对象并占用内存 | StringBuffer不会,拼接多少都是一个对象 | | 重写的toString方法中:return语句 | | 使用完后要把StringBuffer转化成String( sb.toString() ) |

Operate类(实现业务逻辑和功能)

1、实例化类

  1. public class Operator{
  2. //成员属性:List存放Person对象,在此处实例化是因为Operate整个业务功能实现(增删查改)都要用到
  3. private List<Person> list;
  4. //调用构造方法就实例化list
  5. public Operator(){this.list = new Arraylist<>();}
  6. }

2、主菜单业务逻辑:添加业务逻辑控制(同其他业务逻辑控制)

  1. /**
  2. * 添加记录业务逻辑控制
  3. */
  4. public void addLogic() {
  5. //实例化用到的类
  6. Menu menu = new Menu();
  7. TelNoteRegex regex = new TelNoteRegex();
  8. while (true) {
  9. //打印1 子菜单(但是一打印就会就结束方法,返回上一个菜单
  10. // 的死循环中去了,解决:也把他放入死循环中)
  11. menu.addMenu();
  12. //调用校验方法
  13. int item = regex.menuItemValidate(1, 3);
  14. //根据检验出来的菜单数字执行操作
  15. switch (item) {
  16. case 1:
  17. this.addOperation();
  18. break;
  19. case 2:
  20. this.showAll();
  21. break;
  22. case 3:
  23. return;
  24. }
  25. }
  26. }

3、业务功能实现类

①addOperation增加业务功能:

  • 调用name、ID、age等校验类
  • 实例化Person对象,校验结果实例化到Person中
  • 将Person添加到List中
  • ID通过list.size()自动生成

②showAll查询全记录

  • list如果为空,输出语句
  • list如果不为空,遍历list,打印

③searchByName通过姓名查找(假设检验法,假设不存在的flag=true)

  • 调用校验类TelNodeRegex,校验输入的菜单项
  • 假设没找到这个人Boolean flag = true;
  • 遍历list,有则输出并使flag=false
  • 通过flag判断是否输出“查无此人”

    1. /按姓名查询记录
    2. public void searchByName() {
    3. System.out.println("按姓名查询记录");
    4. TelNoteRegex regex = new TelNoteRegex();
    5. //假设flag=true表示 : 输入的人不在,之后进行调整
    6. boolean flag = true;
    7. //对输入信息校验
    8. String name = regex.nameValidate();
    9. //遍历List
    10. for (int i = 0; i < this.list.size(); i++) {
    11. if (name.equals(this.list.get(i).getName())) {
    12. System.out.println(this.list.toString());
    13. flag = false;
    14. }
    15. }
    16. //遍历完了还没有找到
    17. if (flag) {
    18. System.out.println("电话本里没有" + name + "这个姓名的人呦!请查看全记录!");
    19. }
    20. }

    ④modifyLogic修改指定记录的name、ID等

  • 要求输入指定记录序号并校验

  • 打印修改子菜单
  • 要求输入菜单项
  • 根据校验的菜单项执行操作(swich)
  • 调用要修改属性的校验类方法(如name),将校验结果修改到list中
    1. //修改指定记录
    2. public void modifyOperation() {
    3. System.out.println("请输入修改指定记录的序号:");
    4. Menu menu = new Menu();
    5. TelNoteRegex regex = new TelNoteRegex();
    6. //修改指定记录的序号
    7. int itemNum = regex.menuItemValidate(1, this.list.size());
    8. //输出修改子菜单
    9. menu.subModifyMenu();
    10. int menuItem = regex.menuItemValidate(1, 6);
    11. //根据菜单项执行方法(1、调用校验方法 2、将校验结果更改到List中)
    12. switch (menuItem) {
    13. case 1:
    14. String name = regex.nameValidate();
    15. list.get(itemNum - 1).setName(name);
    16. break;
    17. case 2:
    18. String age = regex.ageValidate();
    19. list.get(itemNum - 1).setAge(age);
    20. break;
    21. case 3:
    22. String sex = regex.ageValidate();
    23. list.get(itemNum - 1).setSex(sex);
    24. break;
    25. case 4:
    26. String tel = regex.telNumValidate();
    27. list.get(itemNum - 1).setTelNum(tel);
    28. break;
    29. case 5:
    30. String add = regex.addressValidate();
    31. list.get(itemNum - 1).setAddress(add);
    32. break;
    33. case 6:
    34. return;
    35. }
    36. }

⑤deleteOperation删除指定记录
菜鸟雷区:删除了之后list的ID就乱了,之后把ID整理好
⑥orderByName排序
通过Conlections类调用外部构造器
菜鸟雷区:此处调用构造器类需要使用 new关键字

  1. //按用户姓名排序记录
  2. public void orderName() {
  3. System.out.println("按用户姓名排序");
  4. //直接调用
  5. /**
  6. * 菜鸟雷区:此处调用构造器类需要使用 new关键字
  7. */
  8. Collections.sort(this.list,new OrderByName());
  9. //排完序后把ID重新写下
  10. for (int i = 0;i<this.list.size();i++){
  11. (this.list.get(i)).setId(i+1);
  12. }
  13. }