电话本项目
App类
/**
* 电话本项目入口类
*/
public class App {
/**
* 启动电话本项目
* @param args
*/
public static void main(String[] args) {
}
/**
* 控制主菜单
*/
public void start(){
}
}
菜单类
/**
* 生成项目中所有的菜单
*/
public class Menu {
//主界面
public void mainMenu(){
System.out.println("********************************");
System.out.println("** 1 添加记录 **");
System.out.println("** 2 查找记录 **");
System.out.println("** 3 修改记录 **");
System.out.println("** 4 删除记录 **");
System.out.println("** 5 排序记录 **");
System.out.println("** 6 退出系统 **");
System.out.println("********************************");
}
//添加界面
public void addMenu(){
System.out.println("********************************");
System.out.println("** 1 添加新记录 **");
System.out.println("** 2 查看全记录 **");
System.out.println("** 3 返回上一级 **");
System.out.println("********************************");
}
//查找界面
public void searchMenu(){
System.out.println("********************************");
System.out.println("** 1 按姓名查找 **");
System.out.println("** 2 按年龄查找 **");
System.out.println("** 3 按性别查找 **");
System.out.println("** 4 按号码查找 **");
System.out.println("** 5 按住址查找 **");
System.out.println("** 6 查看全记录 **");
System.out.println("** 7 返回上一级 **");
System.out.println("********************************");
}
//修改界面
public void modifyMenu(){
System.out.println("********************************");
System.out.println("** 1 查看全记录 **");
System.out.println("** 2 修改指定记录 **");
System.out.println("** 3 返回上一级 **");
System.out.println("********************************");
}
//修改子界面
public void subModifyMenu(){
System.out.println("********************************");
System.out.println("** 1 修改姓名 **");
System.out.println("** 2 修改年龄 **");
System.out.println("** 3 修改性别 **");
System.out.println("** 4 修改号码 **");
System.out.println("** 5 修改住址 **");
System.out.println("** 6 返回上一级 **");
System.out.println("********************************");
}
//删除界面
public void deleteMenu(){
System.out.println("********************************");
System.out.println("** 1 查看全记录 **");
System.out.println("** 2 删除指定记录 **");
System.out.println("** 3 删除全部记录 **");
System.out.println("** 4 返回上一级 **");
System.out.println("********************************");
}
//排序界面
public void orderMenu(){
System.out.println("********************************");
System.out.println("** 1 按姓名排序 **");
System.out.println("** 2 按年龄排序 **");
System.out.println("** 3 按性别排序 **");
System.out.println("** 4 查看全部记录 **");
System.out.println("** 5 返回上一级 **");
System.out.println("********************************");
}
}
创建实体类
/**
* 实体类
*/
public class Person {
private int id;
private String name;
private String age;
private String sex;
private String telNum;
private String address;
public Person() {
}
public Person(String name, String age, String sex, String telNum, String address) {
this.name = name;
this.age = age;
this.sex = sex;
this.telNum = telNum;
this.address = address;
}
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 getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTelNum() {
return telNum;
}
public void setTelNum(String telNum) {
this.telNum = telNum;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("序号").append(this.id).append("#").append("\t\t");
sb.append("姓名").append(this.name).append("\t\t");
sb.append("年龄").append(this.age).append("\t\t");
sb.append("性别").append(this.sex).append("\t\t");
sb.append("电话号码").append(this.telNum).append("\t\t");
sb.append("地址").append(this.address).append("\t\t");
return sb.toString();
}
}
创建核心业务类
/**
* 核心业务类
*/
public class Operate {
private List<Person> list;
public Operate(){
this.list =new ArrayList<>();
}
/**
*用于添加记录业务逻辑控制
*/
public void addLogic(){
}
/**
*用于查找记录业务逻辑控制
*/
public void searchLogic(){
}
/**
*用于修改记录业务逻辑控制
*/
public void modifyLogic(){
}
/**
*用于删除记录业务逻辑控制
*/
public void deleteLogic(){
}
/**
*用于排序记录业务逻辑控制
*/
public void orderLogic(){
}
/**
* 添加新纪录
*/
public void addOperation(){
}
/**
* 查询全部记录
*/
public void showAll(){
}
/**
* 按姓名查询记录
*/
public void searchByName(){
}
/**
* 按年龄查询记录
*/
public void searchByAge(){
}
/**
* 按性别查询记录
*/
public void searchBySex(){
}
/**
* 按电话号码查询记录
*/
public void searchByTelNum(){
}
/**
* 按地址查询记录
*/
public void searchByAdd(){
}
/**
* 用于修改指定记录
*/
public void modifyOperation(){
}
/**
* 用于删除指定记录
*/
public void deleteOperation(){
}
/**
* 用于删除全部记录
*/
public void deleteAllOperation(){
}
/**
* 用于按用户姓名排序记录
*/
public void orderName(){
}
/**
* 用于按用户年龄排序记录
*/
public void orderAge(){
}
/**
* 用于按用户性别排序记录
*/
public void orderSex(){
}
}
创建数据校验类
/**
* 数据校验类
*/
public class TelNoteRegex {
/**
* 对菜单输入选项的验证
*/
public int menuItemValidate(int min,int max){
return 0;
}
/**
* 对用户输入姓名的验证
*/
public String nameValidate(){
return null;
}
/**
* 对用户输入年龄的验证
*/
public String ageValidate(){
return null;
}
/**
* 对用户输入性别的验证
*/
public String sexValidate(){
return null;
}
/**
* 对用户输入电话号码的验证
*/
public String telNumValidate(){
return null;
}
/**
* 对用户输入地址的验证
*/
public String addressValidate(){
return null;
}
}
创建比较器类——Operate类内部
/**
* 按姓名排序的比较器
*/
class orderByName implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return 0;
}
}
/**
* 按年龄排序的比较器
*/
class orderByAge implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return 0;
}
}
/**
* 按性别排序的比较器
*/
class orderBySex implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return 0;
}
}
正则表达式pattern
正则表达式,又称规则表达式。(英语: Regular Expression,在代码中常简写为regex,regexp或 RE)。正则表达式通常被用来检索、替换
那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这
个“规则字符串"用来表达对字符串的一种过滤逻辑。使用特殊语法来表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字
符一起表示一个模式。
【特点】
- 灵活性、逻辑性和功能性非常的强;
- 可以迅速地用极简单的方式达到字符串的复杂控制
【Java中正则表达式的使用】
在Java中正则表达式为string类型,被验证的内容同样为String 类型。通过string 类中的matches方法实现内容的匹配校验。如:”被验证
内容”.matches(“正则表达式”)
【语法规则】
正则表达式语法规则:[内容限定]{长度限定}
【内容限定】
在定义限定内容规则时,如果没有指定长度限定,那么默认长度为1。
【单个字符限定】
[a]表示内容必须是"a"
【范围字符限定】
[a-z0-9]表示内容是az09范围内
【取反限定】
[^]表示内容取反
【长度限定】
在正则表达式中通过{}来限定内容长度。
【固定长度】:{固定长度值}
【范围长度】:{最小长度值,最大长度值}
【长度限定符号】通过预定义符号来完成长度限定 |
---|
?号 零次或一次。等同于{0,1} |
+号 一次或多次。等同于{1,} |
*号 零次或多次。等同于{0,} |
预定义字符
字符(转义字符\后跟) | 描述 |
---|---|
\d | 匹配一个数字字符,等价于[0-9] |
\D | 匹配一个非数字字符,等价于[0-9]取反 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\w | 匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_] |
\W | 匹配任何非单词字符,等价于[A-Za-z0-9_]取反 |
正则表达式的组合定义
必须是以字母开头,最少长度为4,最大长度为8
" [a-z]{1}\\w{3,7}"
校验带有区号的电话号码的正则表达式
"\\d{3,4)-\\d{7,8}"
"(\\d{3,4})-(\\d{7,8})"
常见的正则表达式
实现验证类中的方法
对菜单项的验证
/**
* 对菜单输入选项的验证
*/
public int menuItemValidate(int min,int max){
//定义验证菜单项的正则表达式
String regex = "[1-9]{1}";
//创建键盘输入对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入正确的数字,最小是: "+min+"\t"+"最大是: "+max);
String input = scanner.nextLine();
if(input.matches(regex)){
int inputNum = Integer.parseInt(input);
if(inputNum >= min && inputNum <= max){
return inputNum;
}else{
System.out.println("您输入的菜单项不符,请重新输入!");
}
}else{
System.out.println("输入数字错误,请检查!");
}
}
}
对姓名的验证
/**
* 对用户输入姓名的验证
* 字母,长度1-10之间,允许大小写
*/
public String nameValidate(){
//验证姓名的正则表达是
String regex = "[a-zA-Z]{1,10}";
//创建Scanner对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入姓名,格式为1-10位的大小写字母");
String input = scanner.nextLine();
if(input.matches(regex)){
return input;
}else{
System.out.println("您当前输入的姓名有误,请重新输入!");
}
}
}
对年龄的验证
/**
* 对用户输入年龄的验证
* 10-99之间
*/
public String ageValidate(){
//定义校验年龄的正则表达式
String regex = "[1-9]{1}[0-9]{1}";
//创建Scanner对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入年龄,格式为10-99!");
String input = scanner.nextLine();
if(input.matches(regex)){
return input;
}else{
System.out.println("您输入的年龄格式有误,请重新输入");
}
}
}
对性别的验证
/**
* 对用户输入性别的验证
* 男人:m M
* 女人:f F
*/
public String sexValidate(){
//定义校验性别的正则表达式
String regex = "[m|M|f|F]{1}";
//创建键盘输入对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("输入性别,格式(男:M or m)(女:F or f)");
String input = scanner.nextLine();
if(input.matches(regex)){
return input;
}else{
System.out.println("输入性别有误,请重新输入!");
}
}
}
对电话号码的验证
/**
* 对用户输入电话号码的验证
* 允许带有区号的座机号和手机号
*/
public String telNumValidate(){
//定义校验电话号码的正则表达式
String regex = "(\\d{3,4}-\\d{7,8})|([1]{1}\\d{10})";
//创建键盘输入对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入电话号码,座机号或手机号!");
String input = scanner.nextLine();
if(input.matches(regex)){
return input;
}else{
System.out.println("您输入的电话号码格式有误,请重新输入");
}
}
}
对地址的验证
/**
* 对用户输入地址的验证
* 允许字母或数字,长度1-50
*/
public String addressValidate(){
//定义校验地址的正则表达式
String regex = "[a-zA-Z0-9]{1,50}";
//创建键盘输入对象
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("请输入地址,格式为1-50位的数字或大小写字母");
String input = scanner.nextLine();
if(input.matches(regex)){
return input;
}else{
System.out.println("您输入的地址格式有误,请重新输入!");
}
}
}
测试验证类
public static void main(String[] args) {
TelNoteRegex regex = new TelNoteRegex();
/*int menuItem = regex.menuItemValidate(1,7);
System.out.println(menuItem);*/
/* String name = regex.nameValidate();
System.out.println(name);*/
/*String age = regex.ageValidate();
System.out.println(age);*/
/*String sex = regex.sexValidate();
System.out.println(sex);*/
/*String telNum = regex.telNumValidate();
System.out.println(telNum);*/
/*String address = regex.addressValidate();
System.out.println(address);*/
}
实现App类中的方法
实现start方法——控制主菜单
/**
* 控制主菜单
*/
public void start(){
Menu menu = new Menu();
TelNoteRegex regex = new TelNoteRegex();
Operate operate = new Operate();
while(true){
menu.mainMenu();
int item = regex.menuItemValidate(1,6);
switch(item){
case 1:operate.addLogic();
break;
case 2:operate.searchLogic();
break;
case 3:operate.modifyLogic();
break;
case 4:operate.deleteLogic();
break;
case 5:operate.orderLogic();
break;
case 6:System.exit(0);//结束当前虚拟机
}
}
}
实现main方法
public static void main(String[] args) {
App app = new App();
app.start();
}
实现Operate类中的方法
实现添加记录业务逻辑方法
/**
*用于添加记录业务逻辑控制
*/
public void addLogic(){
Menu menu = new Menu();
TelNoteRegex telNoteRegex = new TelNoteRegex();
while(true){
menu.addMenu();
int item = telNoteRegex.menuItemValidate(1, 3);
switch(item){
case 1:this.addOperation();break;
case 2:this.showAll();break;
case 3:return;
}
}
}
实现查询记录业务逻辑方法
/**
*用于查找记录业务逻辑控制
*/
public void searchLogic(){
Menu menu = new Menu();
TelNoteRegex telNoteRegex = new TelNoteRegex();
while(true){
menu.searchMenu();
int item = telNoteRegex.menuItemValidate(1, 7);
switch(item){
case 1:this.searchByName();break;
case 2:this.searchByAge();break;
case 3:this.searchBySex();break;
case 4:this.searchByTelNum();break;
case 5:this.searchByAdd();break;
case 6:this.showAll();break;
case 7:return;
}
}
}
实现修改记录业务逻辑控制
/**
*用于修改记录业务逻辑控制
*/
public void modifyLogic(){
Menu menu = new Menu();
TelNoteRegex telNoteRegex = new TelNoteRegex();
while(true){
menu.modifyMenu();
int item = telNoteRegex.menuItemValidate(1, 3);
switch(item){
case 1:this.showAll();break;
case 2:this.modifyOperation();break;
case 3:return;
}
}
}
实现删除记录业务逻辑控制
/**
*用于删除记录业务逻辑控制
*/
public void deleteLogic(){
Menu menu = new Menu();
TelNoteRegex telNoteRegex = new TelNoteRegex();
while(true){
menu.deleteMenu();
int item = telNoteRegex.menuItemValidate(1, 4);
switch(item){
case 1:this.showAll();break;
case 2:this.deleteOperation();break;
case 3:this.deleteAllOperation();break;
case 4:return;
}
}
}
实现排序记录业务逻辑控制
/**
*用于排序记录业务逻辑控制
*/
public void orderLogic(){
Menu menu = new Menu();
TelNoteRegex telNoteRegex = new TelNoteRegex();
while(true){
menu.orderMenu();
int item = telNoteRegex.menuItemValidate(1, 5);
switch(item){
case 1:this.orderName();break;
case 2:this.orderAge();break;
case 3:this.orderSex();break;
case 4:this.showAll();break;
case 5:return;
}
}
}
实现添加记录业务功能
/**
* 添加新纪录
*/
public void addOperation(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String name = telNoteRegex.nameValidate();
String age = telNoteRegex.ageValidate();
String sex = telNoteRegex.sexValidate();
String telNum = telNoteRegex.telNumValidate();
String address = telNoteRegex.addressValidate();
Person person = new Person(name,age,sex,telNum,address);
this.list.add(person);
person.setId(this.list.size());
}
实现查看全记录业务功能
/**
* 查询全部记录
*/
public void showAll(){
if(this.list.size() == 0){
System.out.println("目前尚未有记录!");
return;
}
for (int i = 0; i < this.list.size(); i++) {
System.out.println(this.list.get(i));
}
}
实现按姓名查找记录业务功能
/**
* 按姓名查询记录
*/
public void searchByName(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String name = telNoteRegex.nameValidate();
boolean flag = true;
for (int i = 0; i < this.list.size(); i++) {
if(name.equals(this.list.get(i).getName())){
System.out.println(this.list.get(i));
flag = false;}
}
if (flag){
System.out.println("没有此人记录!");
}
}
实现按年龄查找记录业务功能
/**
* 按年龄查询记录
*/
public void searchByAge(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String age = telNoteRegex.ageValidate();
boolean flag = true;
for (int i = 0; i < this.list.size(); i++) {
if(age.equals(this.list.get(i).getAge())){
System.out.println(this.list.get(i));
flag = false;}
}
if (flag){
System.out.println("没有和此年龄相关的记录!");
}
}
实现按性别查找记录业务功能
/**
* 按性别查询记录
* 查找是否区别大小写可以预先设置好
* 这里忽略大小写
*/
public void searchBySex(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String sex = telNoteRegex.sexValidate();
boolean flag = true;
for (int i = 0; i < this.list.size(); i++) {
if(sex.equalsIgnoreCase(this.list.get(i).getSex())){
System.out.println(this.list.get(i));
flag = false;}
}
if (flag){
System.out.println("没有相关性别的记录!");
}
}
实现按电话号码查找记录业务功能
/**
* 按电话号码查询记录
*/
public void searchByTelNum(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String telNum = telNoteRegex.telNumValidate();
boolean flag = true;
for (int i = 0; i < this.list.size(); i++) {
if(telNum.equalsIgnoreCase(this.list.get(i).getTelNum())){
System.out.println(this.list.get(i));
flag = false;}
}
if (flag){
System.out.println("没有相关号码的记录!");
}
}
实现按地址查找记录业务功能
/**
* 按地址查询记录
*/
public void searchByAdd(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
String address = telNoteRegex.addressValidate();
boolean flag = true;
for (int i = 0; i < this.list.size(); i++) {
if(address.equalsIgnoreCase(this.list.get(i).getAddress())){
System.out.println(this.list.get(i));
flag = false;}
}
if (flag){
System.out.println("没有相关地址的记录!");
}
}
添加、查找的操作都有输入合法性的检测——通过正则表达式
实现修改指定记录业务功能
/**
* 用于修改指定记录
*/
public void modifyOperation(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
Menu menu = new Menu();
//对被修改记录的序号进行验证,可以使用对菜单项验证的方法来完成
System.out.println("请输入记录的序号!");
int itemNum = telNoteRegex.menuItemValidate(1,this.list.size());
menu.subModifyMenu();
int menuItem = telNoteRegex.menuItemValidate(1,6);
switch(menuItem){
case 1:String name = telNoteRegex.nameValidate();
(this.list.get(itemNum-1)).setName(name);break;
case 2:String age = telNoteRegex.ageValidate();
(this.list.get(itemNum-1)).setAge(age);break;
case 3:String sex = telNoteRegex.sexValidate();
(this.list.get(itemNum-1)).setSex(sex);break;
case 4:String telNum = telNoteRegex.telNumValidate();
(this.list.get(itemNum-1)).setTelNum(telNum);break;
case 5:String address = telNoteRegex.addressValidate();
(this.list.get(itemNum-1)).setAddress(address);break;
case 6:return;
}
}
实现删除指定记录业务功能
/**
* 用于删除指定记录
*/
public void deleteOperation(){
TelNoteRegex telNoteRegex = new TelNoteRegex();
System.out.println("请输入记录的序号!");
int itemNum = telNoteRegex.menuItemValidate(1,this.list.size());
this.list.remove(itemNum-1);
//重新为记录设置新的序号
for (int i = 0; i < this.list.size(); i++) {
(this.list.get(i)).setId(i+1);
}
System.out.println("删除成功,请继续操作!");
}
实现删除全部记录业务功能
/**
* 用于删除全部记录
*/
public void deleteAllOperation(){
this.list.clear();
System.out.println("电话本记录已清空,请继续操作!");
}
实现比较器的排序规则——定义为String的优点体现出来了
/**
* 按姓名排序的比较器
*/
class orderByName implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
/**
* 按年龄排序的比较器
*/
class orderByAge implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge().compareTo(o2.getAge());
}
}
/**
* 按性别排序的比较器
*/
class orderBySex implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getSex().compareTo(o2.getSex());
}
}
实现排序记录功能
/**
* 用于按用户姓名排序记录
*/
public void orderName(){
Collections.sort(this.list,new orderByName());
//重新设置序号
for (int i = 0; i < this.list.size(); i++) {
(this.list.get(i)).setId(i+1);
}
}
/**
* 用于按用户年龄排序记录
*/
public void orderAge(){
Collections.sort(this.list,new orderByAge());
//重新设置序号
for (int i = 0; i < this.list.size(); i++) {
(this.list.get(i)).setId(i+1);
}
}
/**
* 用于按用户性别排序记录
* 按性别排序这里的优先级如下:
* F M f m
*/
public void orderSex(){
Collections.sort(this.list,new orderBySex());
//重新设置序号
for (int i = 0; i < this.list.size(); i++) {
(this.list.get(i)).setId(i+1);
}
}
缺点:一旦进入添加记录,不添加无法返回菜单
导出项目
- 导出电话本项目的jar包
-
创建启动项目的批处理文件
bat文件内容:java -jar phonebook.jar
jar文件和bat文件必须在同一个目录下