编码规范
类中方法的实现
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;
//调用构造方法就实例化list
public 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();
//遍历List
for (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);
}
}