编码规范
类中方法的实现
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、实例化类
public class Operator{//成员属性:List存放Person对象,在此处实例化是因为Operate整个业务功能实现(增删查改)都要用到private List<Person> list;//调用构造方法就实例化listpublic Operator(){this.list = new Arraylist<>();}}
2、主菜单业务逻辑:添加业务逻辑控制(同其他业务逻辑控制)
/*** 添加记录业务逻辑控制*/public void addLogic() {//实例化用到的类Menu menu = new Menu();TelNoteRegex regex = new TelNoteRegex();while (true) {//打印1 子菜单(但是一打印就会就结束方法,返回上一个菜单// 的死循环中去了,解决:也把他放入死循环中)menu.addMenu();//调用校验方法int item = regex.menuItemValidate(1, 3);//根据检验出来的菜单数字执行操作switch (item) {case 1:this.addOperation();break;case 2:this.showAll();break;case 3:return;}}}
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判断是否输出“查无此人”
/按姓名查询记录public void searchByName() {System.out.println("按姓名查询记录");TelNoteRegex regex = new TelNoteRegex();//假设flag=true表示 : 输入的人不在,之后进行调整boolean flag = true;//对输入信息校验String name = regex.nameValidate();//遍历Listfor (int i = 0; i < this.list.size(); i++) {if (name.equals(this.list.get(i).getName())) {System.out.println(this.list.toString());flag = false;}}//遍历完了还没有找到if (flag) {System.out.println("电话本里没有" + name + "这个姓名的人呦!请查看全记录!");}}
④modifyLogic修改指定记录的name、ID等
要求输入指定记录序号并校验
- 打印修改子菜单
- 要求输入菜单项
- 根据校验的菜单项执行操作(swich)
- 调用要修改属性的校验类方法(如name),将校验结果修改到list中
//修改指定记录public void modifyOperation() {System.out.println("请输入修改指定记录的序号:");Menu menu = new Menu();TelNoteRegex regex = new TelNoteRegex();//修改指定记录的序号int itemNum = regex.menuItemValidate(1, this.list.size());//输出修改子菜单menu.subModifyMenu();int menuItem = regex.menuItemValidate(1, 6);//根据菜单项执行方法(1、调用校验方法 2、将校验结果更改到List中)switch (menuItem) {case 1:String name = regex.nameValidate();list.get(itemNum - 1).setName(name);break;case 2:String age = regex.ageValidate();list.get(itemNum - 1).setAge(age);break;case 3:String sex = regex.ageValidate();list.get(itemNum - 1).setSex(sex);break;case 4:String tel = regex.telNumValidate();list.get(itemNum - 1).setTelNum(tel);break;case 5:String add = regex.addressValidate();list.get(itemNum - 1).setAddress(add);break;case 6:return;}}
⑤deleteOperation删除指定记录
菜鸟雷区:删除了之后list的ID就乱了,之后把ID整理好
⑥orderByName排序
通过Conlections类调用外部构造器
菜鸟雷区:此处调用构造器类需要使用 new关键字
//按用户姓名排序记录public void orderName() {System.out.println("按用户姓名排序");//直接调用/*** 菜鸟雷区:此处调用构造器类需要使用 new关键字*/Collections.sort(this.list,new OrderByName());//排完序后把ID重新写下for (int i = 0;i<this.list.size();i++){(this.list.get(i)).setId(i+1);}}
