这篇博客之前从另外一个博客发过一次,只不过那个博客被我注销了,于是再发一次。这个小作业是在自学javase八成之后向老师要的一个小项目,练练手,也让自己学过的知识更加巩固,当时上网查找这个项目的代码什么的发现很多都需要费用,写这篇博客也是想把这个东西分享给大家,博客上所写的代码仅供参考,有什么不足的地方请各位大牛们随时指正,下面的图片是从项目指导书里面复制过来的,为了给大家看的更清楚,也更明白编写的结构和需求。好了,废话不多说,详细请看下方

一、项目描述

该项目是用于日常生活中记录联系人信息的一款小工具。

实现了对联系人的姓名、年龄、性别、电话号码、住址的添加及修改、查找、删除、排序等功能。该项目是以windows控制台为运行平台,所有的操作都应在控制台上进行。

1.1、编写目的

1、该项目编写的主要目的使学员对以往所学过的知识点做一个统一的复习,将平时所学的内容综合到一起并运用到实际代码编写中。

2、 该项目能够充分的体现出一些简单的业务流程处理,能够使学员掌握基本的业务流程控制。

二、项目流程图

2.1业务流程结构图

2.2基本操作流程图

2.2.1当运行主程序后可在控制台显示主菜单,用户可选择菜单中的选项进行相应的操作如用户输入的菜单选项超出当前菜单所规定的范围外,程序不予以执行,并返回当前菜单,用户需要重新输入。见(图表1)

2.2.2用户选择1 可进入添加记录的下级子菜单见(图表2)

2.2.3当进入下级子菜单后,用户可根据提示进行用户的添加见(图表3)

2.2.4在添加新联系人时应对所添加的选项进行验证,如果有输入错误应提示见(图表4)

2.2.5添加完毕后可查看电话薄内的全部记录见(图表5)

2.2.6选择返回选项时,可返回上级主菜单见(图表6)

2.2.7选择2进入查找记录子菜单见(图表7)

2.2.8用户可根据具体内容进行相关查询见(图表8)

2.2.9选择3进入修改记录子菜单见(图表9)

2.2.10通过查看全记录,找到要修改联系的ID号对联系人的内容进行相应的修改见(图表10,11)

2.2.11选择4进入删除记录子菜单见(图表12)。

2.2.12删除共分为删除指定记录和删除全部两种操作。删除指定记录时需要输入被删除

人的ID序号。删除成功后可继续操作见(图表13,14)

此时ID为1的ZhangSan用户已被删除,ID为2的LiSi的ID序号会制动增长为1

2.2.13删除全部用户。选择该选项可将电话薄清空见(图表15)

2.2.14用户可选择不同的选项对电话薄内的信息进行任意排序见(图表16,17,18,19)

按姓名排序结果

按年龄排序结果

按性别排序结果

三、设计流程图

四、类设计流程图

五、技术要求

键盘输入Scanner类

正则表达式Pattern类

容器ArrayList类

排序方式(比较器排序)Comparator接口,Collections类

六、编码规范

1、类名

App 对应 Application(程序入口函数)

Menu 对应 Menu (菜单类)

Operate 对应 Operate (业务处理类)

Person 对应 Person (实体类)

TelNoteRegex 对应 TelNoteRegex(用户输入验证类)

OrderByName 对应 OrderByName (姓名排序比较器)

OrderByAge 对应 OrderByAge (年龄排序比较器)

OrderBySex 对应 OrderBySex(性别排序比较器)

2、方法名

2.1、App类中方法(无成员变量)

main() 程序入口函数

start() 主菜单控制

2.2、Operate类中方法及成员变量

*private* Vector<Person> v 集合

addLogic() 用户添加信息业务逻辑控制

searchLogic() 用户查询信息业务逻辑控制

modifyLogicLogic() 修改信息业务逻辑控制

deleteLogic() 删除信息业务逻辑控制

orderLogic() 排序信息业务逻辑控制

addOperation () 添加新用户信息

showAll() 查询全部用户信息

searchByName() 按姓名查询用户信息

searchByAge() 按年龄查询用户信息

searchBySex() 按性别查询用户信息

searchByTelNum() 按电话号码查询用户信息

searchByAdd() 按地址查询用户信息

modify() 修改指定记录信息

delete() 删除指定用户信息

deleteAll() 删除全部用户信息

orderName() 按用户姓名排序信息

orderAge() 按用户年龄排序信息

orderSex() 按用户性别排序信息

2.3、TelNoteRegex类中方法(无成员变量)

menuRegex (int min, int max ) 对菜单输入选项的验证

nameRegex ( ) 对用户输入姓名的验证

ageRegex ( ) 对用户输入年龄的验证

sexRegex ( ) 对用户输入性别的验证

telNumRegex ( ) 对用户输入电话号码的验证

addressRegex ( ) 对用户输入地址的验证

2.4、Menu类中的方法(无成员变量)

mainMenu() 主菜单

addMenu () 添加用户菜单

searchMenu () 查找用户菜单

modifyMenu () 修改用户信息主菜单

subModifyMenu () 修改用户信息子菜单

deleteMenu () 删除用户信息菜单

orderMenu () 排序用户信息菜单

2.5、Person类中的方法及成员变量

*private* *int* id; 用户ID 属性

*private* String name; 用户姓名属性

*private* String age; 用户年龄属性

*private* String sex; 用户性别属性

*private* String telNum; 用户电话号码属性

*private* String address; 用户地址属性

Person() 无参数构造方法

Person(String name, String age, String sex, String telNum, String address) 有参数构造方法

getName() 读取用户名

setName(String name) 设置用户名

getAge() 读取用户年龄

setAge(String age) 设置用户年龄

getSex() 读取用户性别

setSex(String sex) 设置用户性别

getTelNum() 读取用户电话号码

setTelNum (String telNum) 设置用户电话号码

getAddress() 读取用户地址

setAddress(String address) 设置用户地址

getID () 读取用户ID号

setID (int ID) 设置用户ID号

toString() 连接字符串方法

七、项目开发

1、创建项目

2、创建类(先搭建框架,再往里面填代码)

2.1、创建App类


 /*电话本项目入口类*/public class APP {public static void main(String[] args) {​}/*控制主菜单*/public void start(){}

2.2、创建菜单类

 public class Menu {//主菜单public void mainMenu(){System.out.println("        主菜单         ");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("**********************");System.out.println("**    1.添加新记录    **");System.out.println("**    2.查看全记录    **");System.out.println("**    3.返回上一级    **");System.out.println("**********************");​}//查找用户菜单public void searchMenu(){System.out.println("     查找记录子菜单     ");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("**********************");​​}//modifyMenu () 修改用户信息主菜单public void modifyMenu(){System.out.println("     修改记录子菜单     ");System.out.println("**********************");System.out.println("**    1.查看全记录    **");System.out.println("**    2.修改指定记录  **");System.out.println("**    3.返回上一级    **");System.out.println("**********************");​}//subModifyMenu () 修改用户信息子菜单public void subModifyMenu(){System.out.println("     修改指定记录子菜单     ");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("**********************");​}// deleteMenu () 删除用户信息菜单public void deleteMenu(){System.out.println("     删除记录子菜单     ");System.out.println("**********************");System.out.println("**    1.查看全记录    **");System.out.println("**    2.删除指定记录  **");System.out.println("**    3.删除全部记录  **");System.out.println("**    4.返回上一级    **");System.out.println("**********************");​}//orderMenu () 排序用户信息菜单public void orderMenu(){System.out.println("     排序记录子菜单     ");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("**********************");​}}
 

2.3、创建实体类

 package telDirectory.person;​public class Person {private int id;         //用户ID属性,可以在添加list对象之后用list的长度来对应idprivate String name;    //用户姓名属性private String age;     //用户年龄属性private String sex;     //用户性别属性: 男:m或M 女:f或Fprivate 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;}​@Overridepublic String toString() {StringBuffer sb = new StringBuffer();sb.append("序号").append(this.id).append("#").append("\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);return sb.toString();}}​
2.4、创建核心业务类package telDirectory.operate;​import telDirectory.menu.Menu;import telDirectory.person.Person;import telDirectory.telNoteRegex.TelNoteRegex;​import javax.swing.plaf.SplitPaneUI;import java.util.*;​/*** Operate类中方法及成员变量* private Vector<Person> v 集合** addLogic() 用户添加信息业务逻辑控制* searchLogic() 用户查询信息业务逻辑控制* modifyLogicLogic() 修改信息业务逻辑控制          这些是用来控制业务功能的二级子菜单的* deleteLogic() 删除信息业务逻辑控制* orderLogic() 排序信息业务逻辑控制** addOperation () 添加新用户信息* showAll() 查询全部用户信息* searchByName() 按姓名查询用户信息* searchByAge() 按年龄查询用户信息* searchBySex() 按性别查询用户信息* searchByTelNum() 按电话号码查询用户信息* searchByAdd() 按地址查询用户信息* modify() 修改指定记录信息* delete() 删除指定用户信息* deleteAll() 删除全部用户信息*** orderName() 按用户姓名排序信息* orderAge() 按用户年龄排序信息* orderSex() 按用户性别排序信息*/​/*** 三个内比较器* 定义为内部类*/public class Operate {private List<Person> list ;public Operate(){this.list = new ArrayList<>();}// 用户添加信息业务逻辑控制public void addLogic(){}//用户查询信息业务逻辑控制public void searchLogic() {}//修改信息业务逻辑控制public void modifyLogicLogic(){   }//删除信息业务逻辑控制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 modify(){}//删除指定用户信息public void delete(){   }//删除全部用户信息public void deleteAll(){}//按用户姓名排序信息public void orderName(){}//按用户年龄排序信息public void orderAge(){}//按用户性别排序信息public void orderSex(){}}​

2.5、创建数据校验类


package telDirectory.telNoteRegex;​import java.sql.PreparedStatement;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** TelNoteRegex类中方法(无成员变量)* menuRegex (int min, int max ) 对菜单输入选项的验证* nameRegex ( ) 对用户输入姓名的验证* ageRegex ( ) 对用户输入年龄的验证* sexRegex ( ) 对用户输入性别的验证* telNumRegex ( ) 对用户输入电话号码的验证* addressRegex ( ) 对用户输入地址的验证*/public class TelNoteRegex {​/*** 对菜单输入选项的验证* @param min* @param max* @return*/public  int  menuRegex(int min,int max){}​/*** 对用户输入姓名的验证* 字母长度1-10,可大小写* @return*/public String nameRegex(){}​/*** 对用户输入年龄的验证* @return*/public String ageRegex (){}​/*** 对用户输入性别的验证* 要求 :(男 m or M) (女 f or F)* @return*/public String sexRegex (){}​/*** 对用户输入电话号码的验证* 要求 : 6-10个数字* @return*/public String telNumRegex (){}​/*** 对用户输入地址的验证* 要求: 1-50位的字母或数字* @return*/public String addressRegex (){}}

2.6、创建比较器类

Comparator中文API文档: Java 8 中文版 - 在线API中文手册 - 码工具

排序其只能再电话本种对电话本所存储的记录进行排序,不具备通用性,缩影定义成Operate的内部类

2.6.1、按姓名排序的比较器

  /*** 姓名排序的比较器*/class OrderByName implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return 0;}}

2.6.2、按年龄排序的比较器

  /*** 按年龄排序的比较器*/class OrderByAge implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return 0;}}

2.6.3、按性别排序的比较器

  /*** 按性别排序的比较器*/class OrderBySex implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return 0;}}

3、正则表达式

3.1、正则表达式介绍

3.1.1、什么是正则表达式

正则表达式,又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

3.1.2、正则表达式的作用

给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。

可以通过正则表达式,从字符串中获取我们想要的特定部分。

3.1.2.1、匹配

使用String类的matches方法可以进行整个字符串的匹配,判断某些字符串是否符合相关的规则。只要有一处不符合规则就会返回false,如果都符合返回true。 如:

 public static void main(String[] args) {//用来判断是否符合是6-9位的1-9的数字​String str = ”6666666”;//被匹配的字符串​String regex =”[1-9]{6,9}”; // 定义正则表达式,即匹配规则​Boolean b =str.matches(regex);// 通过matches方法进行判断str是否符合regex制定的规则​System.out.println(b);//matches()方法返回的是boolean值​}

3.1.2.2、切割

使用string类的split()方法对字符串进行切割(split中的参数是正则表达式),可以进行复杂的字符串切割。 如:

 public static void main(String[] args) {//用来切割一串数字,去除多余的空格​String str =” 1 2    3   4  4”;​String regex=” +”;​String [] arr = str. split(regex); //split ()方法返回的是字符串数组​//注意分隔符部分不会进入arr数组中      ​for( String s:arr ){​System.out.println(s);//打印出数字中的每个元素​}​}

3.1.2.3、替换

使用string类的replacAll(),使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。replaceAll方法的参数有两个,第一个是正则表达式,用于定义被替换字符串的规则,第二个参数是替换的字符串。

 public static void main(String[] args){//替换掉字符串中叠词的重复部分​String str =”张张张谢谢哦哦哦”;​String strnew= str.replaceAll( “(.)\\1+”,”$1”);//替换掉重复部分,$1表示取前一个规则的第一组​System.out.println(strnew);//打印出新的字符串​​}

3.1.2.4、获取

将字符串中符合正则表达式的规则字符串取出来。获取的步骤是:

  1. 将正则表达式封装成对象;

  2. 让正则表达式和要操作的字符串相关联;

  3. 关联后,获取正则匹配引擎 ;

  4. 通过引擎对符合规则的字符串进行操作,比如取出。

(其实前三个功能也可以用这个步骤进行处理,只是最后一步不同。这样变复杂了,所以前三个功能没有使用这个步骤,而是简化了操作。)


public static void main(String[] args){//将一句话中有四个字母的单词​String str =” ming tian jiu yao fang jia le ”;​String reg =”\\b[a-x]{4}\\b”;​Patter  p =Patter.complie(reg);//将规则封装成对象​Matcher  m =p.matcher(str);//让正则表达式和要操作的字符串相关联,获取匹配器对象​System.out.println(m.matches());//其实string类中的matches方法、replaceAll()方法,用的就是Pattern和Matcher对象来完成的。只是被String的方法封装了,用起来比较简单。​while(m,find()){​Boolean b =m.find();将规则作用到字符串上,并进行符合规则的子串查找​System.out.println(m.group());//用于获取匹配后的字符串​System.out.println(m.start() +”….” + m.end());//用于获取匹配后的字符串的索引位置​}​}

3.2、正则表达式的语法规则

[内容限定]{长度限定}

3.1、内容限定

在定义限定内容时,如果没有长度限定,那么默认长度为1

3.2、单个字符限定

[a]表示当前内容必须时字母a

3.3、范围字符限定

[a-z0-9]:表示内容可以是a-z之间的任意字母或者是0-9之间的任意数字,不分先后

3.4、取反限定

[^abc]:表示内容不能是a或b或c

3.5、长度限定

在正则表达式中通过{ }来限定内容长度

固定长度:{固定长度值}

范围长度:{最小长度值,最大长度值}

[a-z]{5}:表示内容范围为小写字母a到z且长度必须为5

[a-z]{3,8}:表示内容范围为小写字母a到z且长度在3到8之间,包含2与8

[a-z]{5,}:表示内容范围为小写字母a到z且最小长度为5,最大长度无限制

[a-z]{0,8}:表示内容范围为小写字母a到z且最小长度为0,最大长度为8

3.6、长度限定符号

长度限定符号是指通过预定义符号来完成长度限定的。

?:零次或一次,等同于{0,1}

+:一次或多次,等同于{1,}

*:零次或多次,等同于{0,}

3.3、预定义字符

在正则表达式中通过一些预定义字符来表示内容限定,目的是为了简化内容限定的定义

3.4、常用的正则表达式

这里附上链接:最常用的正则表达式大全_未曾远去的博客-CSDN博客

4、实现验证类中的方法

思路:因为App类中有两个方法,一个是程序入口,另一个是start()方法,用来控制主菜单的,而控制主菜单需要有菜单输入项,用户从控制台进行菜单项的输入,输入之后需要进行菜单项的数据校验,如果输入的菜单项不对,那么程序就无法向下执行,那么就要一直循环,直到拿到正确的菜单项为止,继续程序的执行,而程序继续执行之后,也要从控制太获取姓名,年龄或者其他等等数据,我们也要先进行数据合理性的校验才能接着下一步的执行,因此要先编写数据校验类中的方法代码

4.1、对菜单项的验证

所用:返回一个合法的菜单项

键盘输入应该定义在哪里?App中还是验证方法中

定义在对菜单项验证的方法中,因为当用户输入菜单项时,有可能是不合法的,第一种是输入的不是数字,第二种是输入的数字不在菜单项的数字范围内。当用户输入的数据不合法时,要进行让用户再次输入,直到用户输入正确的数据为止,也就是说要进行循环操作,把键盘输入对象定义在验证方法中会比较好。

思路:

首先定义一个符合格式限定要求的正则表达式,然后创建键盘输入对象,提示用户输入,对从控制台获取用户输入的数据进行验证,假如验证不通过,则继续提示获取,直到获取到符合限定要求的菜单项数据并返回

 
  /*** 对菜单输入选项的验证* @param min* @param max* @return*/ public  int  menuRegex(int min,int max){//定义菜单验证项的正则表达式String regex = "[1-9]{1}";//创建键盘输入对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入正确的数字,最小是:"+min+"\t最大是:"+max);String input = sc.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("输入数字错误,请检查!");}}​}

4.2、对姓名的验证

作用:返回一个符合限定格式的姓名字符串

 
 /*** 对用户输入姓名的验证* 字母长度1-10,可大小写* @return*/public String nameRegex(){//验证姓名的正则表达式String regex = "[a-zA-Z]{1,10}";//创建Scanner对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入姓名,1-10个字母:");String input = sc.nextLine();if (input.matches(regex)){return input;}else {System.out.println("您当前输入的姓名有误,请重新输入!");}}}

4.3、对年龄的验证

作用:返回一个符合限定格式的年龄字符串

 
 /*** 对用户输入年龄的验证* @return*/public String ageRegex (){//验证年龄的正则表达式String regex = "[1-9]{1}[0-9]?";//创建Scanner对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入年龄,1-99 :");String input = sc.nextLine();if (input.matches(regex)){return input;}else {System.out.println("您当前输入的年龄有误,请重新输入!");}}}

4.4、对性别的验证

作用:返回一个符合限定格式的性别

  
/*** 对用户输入性别的验证* 要求 :(男 m or M) (女 f or F)* @return*/public String sexRegex (){//验证年龄的正则表达式String regex = "[m|M|f|F]{1}";//创建Scanner对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入性别,(男 m or M) (女 f or F) :");String input = sc.nextLine();if (input.matches(regex)){return input;}else {System.out.println("您当前输入的性别有误,请重新输入!");}}}

4.5对电话号码的验证

 
 /*** 对用户输入电话号码的验证* 要求 : 6-10个数字* @return*/public String telNumRegex (){//验证电话号的正则表达式String regex = "[0-9]{6,10}";//创建Scanner对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入电话号码,6-10个数字 :");String input = sc.nextLine();if (input.matches(regex)){return input;}else {System.out.println("您当前输入的电话有误,请重新输入!");}}}

4.6对地址的验证

  
/*** 对用户输入地址的验证* 要求: 1-50位的字母或数字* @return*/public String addressRegex (){//验证电话号的正则表达式 \\w表示可用于标识符的字符String regex = "\\w{1,50}";//创建Scanner对象Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入地址,1-50个字母或数字 :");String input = sc.nextLine();if (input.matches(regex)){return input;}else {System.out.println("您当前输入的地址有误,请重新输入!");}}}

4.7、测试验证类中的方法

 
 public static void main(String[] args) {  TelNoteRegex regex = new TelNoteRegex();int menuItem = regex.menuRegex(1,6);System.out.println(menuItem);String name = regex.nameRegex();System.out.println(name);String age = regex.ageRegex();System.out.println(age);String sex = regex.sexRegex();System.out.println(sex);String telnum = regex.telNumRegex();System.out.println(telnum);String address = regex.addressRegex();System.out.println(address);}

5、实现APP类中的方法

5.1、实现start方法

思路:

1、实例化Menu、TelNoteRegex、Operate对象

2、通过对象调用方法

3、调用显示主菜单后,要实现对控制台提示用户输入,这个功能在信息验证类中完成了,因此只需要调用信息验证类中的方法,获取到一个菜单项即可,接着进入二级子菜单的业务逻辑操作,而业务逻辑的操作在Operate类中有对应的方法去实现,因此可以进行方法调用

4、二级子菜单中有一个返回上一级的功能,要保证这个功能的实现,就要保证主菜单一直存在,因此要用到死循环,然后在调用二级子菜单的方法时,用return关键字,结束二级子菜单的方法,就可以返回上一级

 
 public void start(){Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();Operate operate = new Operate();//二级主菜单返回主菜单的功能要实现,要保证主菜单一直存在,要用死循环while (true){menu.mainMenu();int item = telNoteRegex.menuRegex(1,6);switch (item){case 1:operate.addLogic();break;case 2:operate.searchLogic();break;case 3:operate.modifyLogicLogic();break;case 4:operate.deleteLogic();break;case 5:operate.orderLogic();break;case 6:System.exit(0);}}}}

5.2、实现main方法

 
 public static void main(String[] args) {APP app = new APP();app.start();}

6、实现Operate类中的方法

6.1、实现用户添加信息业务逻辑控制的方法

思路:

1、在start方法执行并获取到添加记录的菜单项后,就会进入到添加信息业务的逻辑控制的方法中

2、在逻辑控制的方法中要打印出二级子菜单,然后再获取对应的菜单操作,然后执行具体的动作,具体的动作在Operate类中有对应的方法,因此在获取对应的菜单项后调用对应的方法,思路与start()方法相似,综上,要打印菜单需要创建Menu类对象,信息验证需要创建TelNoteRegex()对象,然后二级子菜单显示后还不能让这个方法结束掉,否则就是展示了一下二级子菜单就返回主菜单了,就不能进行下一步操作,因此要用到死循环

 // 用户添加信息业务逻辑控制public void addLogic(){Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();while (true){menu.addMenu();int item = telNoteRegex.menuRegex(1,3);switch (item){case 1:this.addOperation();break; //添加新纪录case 2:this.showAll();break; //查看全记录case 3:return; //返回上一级 结束当前方法}}}

6.2、实现用户查找信息业务逻辑控制的方法

思路:

与用户添加信息业务逻辑控制方法思路相似

 //用户查询信息业务逻辑控制public void searchLogic() {Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();while(true){menu.searchMenu();int item = telNoteRegex.menuRegex(1,7);switch (item){case 1:searchByName();break;case 2:searchByAge();break;case 3:searchBySex();break;case 4:searchByTelNum();break;case 5:searchByAdd();break;case 6:showAll();break;case 7:return;}}}

6.3、实现用户修改信息业务逻辑控制的方法

  
//修改信息业务逻辑控制public void modifyLogicLogic(){Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();while (true){menu.modifyMenu();int item = telNoteRegex.menuRegex(1,3);switch (item){case 1:showAll();break;case 2:modify();break;case 3:return;}}}

6.4、实现用户删除信息业务逻辑控制的方法

  
//删除信息业务逻辑控制public void deleteLogic(){Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();while (true){menu.deleteMenu();int item = telNoteRegex.menuRegex(1,4);switch (item){case 1:showAll();break;case 2:delete();break;case 3:deleteAll();break;case 4:return;}}}

6.5、实现用户排序信息业务逻辑控制的方法

  
//排序信息业务逻辑控制public void orderLogic() {Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();while (true){menu.orderMenu();int item = telNoteRegex.menuRegex(1,5);switch (item){case 1:orderName();break;case 2:orderAge();break;case 3:orderSex();break;case 4:showAll();break;case 5:return;}}}

到此,控制二级子菜单及相关业务逻辑的方法已经全部实现了,接下去要实现相关的具体操作了

6.6、实现添加记录业务功能

思路

1、添加用户要往集合list中添加用户即Person对象,实例化Person对象需要属性值,这些是从控制台获取的,这些属性值也要进行数据合理性校验

2、用校验完的数据进行对象创建,然后添加到集合中

3、person对象中有ID这个属性,第一个添加进去的ID是1,第二个是二,以此类推,而ID是电话簿系统给的,不是用户进行输入的,这里想到可以用集合的长度来一一对应

 
public void addOperation(){TelNoteRegex telNoteRegex = new TelNoteRegex();String name = telNoteRegex.nameRegex();String age = telNoteRegex.ageRegex();String sex = telNoteRegex.sexRegex();String telnum = telNoteRegex.telNumRegex();String address = telNoteRegex.addressRegex();Person person = new Person(name,age,sex,telnum,address);this.list.add(person);person.setId(this.list.size());}

6.7、实现查看全部用户信息的功能

思路:

1、记录存储在list中,要查看全部信息,只要把list中的元素打印出来即可

2、集合中可能没有元素,因此在打印之前先进行判断集合中有没有记录

3、遍历集合打印有多种方法可以实现:for循环,增强for,迭代器

(增强for的底层支持就是迭代器)

 
 //查询全部用户信息public void showAll(){//添加person对象后打印list的所有内容//如果list里面有元素,就打印,没有就输出提示错误//1.迭代器  2、增强for 3.for循环if(list.size() == 0) {System.out.println("没有任何记录");return;}for (Person person : list) {System.out.println(person.toString());}/* for (int i = 0; i < list.size(); i++) {System.out.println(this.list.get(i));}*/​/*//迭代器//根据集合对象获取迭代器对象Iterator it = list.iterator();//判断集合中是否有元素while (it.hasNext()){Person p = (Person) it.next();System.out.println(p.toString());}*/​}

6.8、实现查找的业务功能

思路:

1、从控制台获取到一个合法的要查找的数据,因此要进行数据合理性校验

2、遍历集合中的对象,用要查找的数据与每一个对象的属性值比较

3、若有一致的说明找到了,打印该对象的全部信息

4、若找不到则提示找不到

5、找不到饿提示信息只打印一次,因此可以通过一个变量来控制他,默认找不到

假如找到了就改变该变量的值

6.8.1、按姓名查找

 
 public void searchByName(){TelNoteRegex telNoteRegex = new TelNoteRegex();String searchName = telNoteRegex.nameRegex();boolean b = true; //默认找不到for (Person person : list) {if (searchName.equals(person.getName())){//能进行到这里说明找到System.out.println(person.toString());b = false;}}if (b){System.out.println("找不到对应信息!");}}

6.8.2、按年龄查找

 
 //按年龄查询用户信息public void searchByAge(){TelNoteRegex telNoteRegex = new TelNoteRegex();String searchAge = telNoteRegex.ageRegex();boolean b = true; //默认找不到for (Person person : list) {if (searchAge.equals(person.getAge())){//能进行到这里说明找到System.out.println(person.toString());b = false;}}if (b){System.out.println("找不到对应信息!");}}

6.8.3、按性别查找

  
 // 按性别查询用户信息public void searchBySex(){TelNoteRegex telNoteRegex = new TelNoteRegex();String searchSex = telNoteRegex.sexRegex();boolean b = true; //默认找不到for (Person person : list) {if (searchSex.equalsIgnoreCase(person.getSex())){//性别大小写都可以,因此比较方法要用不区分大小写,否则f和F会区分开,找不到System.out.println(person.toString());b = false;}}if (b){System.out.println("找不到对应信息!");}}

6.8.4、按电话号码查找

  
 public void searchByTelNum(){TelNoteRegex telNoteRegex = new TelNoteRegex();String searchTelNum = telNoteRegex.telNumRegex();boolean b = true; //默认找不到for (Person person : list) {if (searchTelNum.equals(person.getTelNum())){//能进行到这里说明找到System.out.println(person.toString());b = false;}}if (b){System.out.println("找不到对应信息!");}

6.8.5、按地址查找


 //按地址查询用户信息public void searchByAdd(){TelNoteRegex telNoteRegex = new TelNoteRegex();String searchAdd = telNoteRegex.addressRegex();boolean b = true; //默认找不到for (Person person : list) {if (searchAdd.equals(person.getAddress())){//能进行到这里说明找到System.out.println(person.toString());b = false;}}if (b){System.out.println("找不到对应信息!");}}

6.9、实现修改指定记录的功能

思路:

1、打印三级菜单

2、获取合法的菜单项

3、根据获取的菜单项进行对应的操作

  
//修改指定记录信息//先询问并获取要修改的对象的序号,再询问要修改该对象的具体信息/*** 修改信息的具体操作*   1.获取要修改信息的对应菜单编号*   2.先获取到要修改信息的正确格式*   3.调用person类的setXXX方法,对相应的值进行设置*/public void modify(){Menu menu = new Menu();TelNoteRegex telNoteRegex = new TelNoteRegex();System.out.println("请输入要修改对象的序号");int itemNum = telNoteRegex.menuRegex(1,this.list.size());while (true){menu.subModifyMenu();int item = telNoteRegex.menuRegex(1,6);switch (item){case 1:{String name = telNoteRegex.nameRegex();this.list.get(itemNum-1).setName(name);break;}case 2:{String age = telNoteRegex.ageRegex();this.list.get(itemNum).setAge(age);break;}case 3:{String sex = telNoteRegex.sexRegex();this.list.get(itemNum).setSex(sex);break;}case 4:{String telNum = telNoteRegex.telNumRegex();this.list.get(itemNum).setTelNum(telNum);break;}case 5:{String add = telNoteRegex.addressRegex();this.list.get(itemNum).setAddress(add);break;}case 6:return;}}​}

6.10、实现删除记录的业务功能

思路:

1、询问要删除的对象的序号

2、序号要进行验证,不能超过集合list的长度,在这里可以借助菜单验证的方法来进行验证

3、序号是集合长度对应的,要删除的对象的下标应该是长度-1

  //删除指定用户信息public void delete(){TelNoteRegex telNoteRegex = new TelNoteRegex();System.out.println("请输入要删除的对象的序号");int itemNum = telNoteRegex.menuRegex(1,this.list.size());this.list.remove(itemNum-1);//删除完之后里边的序号也就是ID会乱,要重新设置for (int i = 0; i < list.size(); i++) {this.list.get(i).setId(i+1);}System.out.println("删除成功!");​}//删除全部用户信息public void deleteAll(){list.clear();System.out.println("信息删除成功!");​}

6.11、实现排序器


 /*** 姓名排序的比较器*/class OrderByName implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return o1.getName().compareTo(o2.getName());}}/*** 按年龄排序的比较器*/class OrderByAge implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return o1.getAge().compareTo(o2.getAge());}}/*** 按性别排序的比较器*/class OrderBySex implements Comparator<Person>{​@Overridepublic int compare(Person o1, Person o2) {return o1.getSex().compareTo(o2.getSex());}}​}

6.12、实现排序信息的业务功能

思路:

1、给定一个外部的比较器,通过这个比较器的规则对list中的对象进行排序

2、使用Collections类下的sort方法

3、排序后ID是乱的的要重新设置排序

6.12.1、按用户姓名排序信息

  
//按用户姓名排序信息public void orderName(){Collections.sort(this.list,new OrderByName());for (int i = 0; i < list.size(); i++) {this.list.get(i).setId(i+1);}System.out.println("排序成功");​}

6.12.2、按用户性别排序信息

  
 //按用户性别排序信息public void orderAge(){Collections.sort(this.list,new OrderByAge());for (int i = 0; i < list.size(); i++) {this.list.get(i).setId(i+1);}System.out.println("排序成功");}

6.12.3、按用户性别排序信息

 
  //按用户性别排序信息public void orderSex(){Collections.sort(this.list,new OrderBySex());for (int i = 0; i < list.size(); i++) {this.list.get(i).setId(i+1);}System.out.println("排序成功");}

电话簿管理系统(超详细)相关推荐

  1. python实现图书管理系统(超详细)

    python实现图书管理系统 图书管理系统 python实现图书管理系统 图书管理系统: 图书的功能: 现在开始添加数据: 增加数据 删除数据 查询数据 图书位置修改 图书的借出 图书的还回 主体界面 ...

  2. 狂神Spring Boot 员工管理系统 超详细完整实现教程(小白轻松上手~)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细)——登录,注册及找回密码篇

    python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细)--登录,注册及找回密码篇 前言 一.pyqt5是什么? 二.代码方面 1.引入库及效果展示 2.首先介绍一下登录,注册及密码 ...

  4. python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——增删改查篇

    python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)--增删改查篇 前言 一.主界面的样式 二.学生信息的增,删,改,查 1.增加学生信息 2.删除学生信息 3.更改学 ...

  5. 【超详细Django网站开发过程9】便利店管理系统之——管理员登录、注销功能

    管理系统当然要有管理员登录功能啦,怎么做呢? Lynjay的便利店管理系统,登录API如下: 1.请求消息: POST /api/mgr/signin HTTP/1.1 Content-Type: a ...

  6. 学生管理系统(超详细)

    学生管理系统(详细说明) 一. 简要介绍 二. 数据集 三. 四大模块 1. 模块一:文件读写 1.1. csv文件 1.2 文件读入 1.3 文件写出 2.模块二:辅助函数 2.1 链表释放函数 2 ...

  7. 部署无鱼工时系统,超详细教程,并成功部署

    部署无鱼工时系统 公司一个部门是做外包的,经常要项目组报工时记录给甲方,之前一直使用excel方式,最近要使用无鱼工时系统,准备部署一个. 下面是我的部署手记-超详细的介绍了这个项目的部署流程到最后运 ...

  8. 想搭建一个专属于你的网站吗??新手向超详细攻略

    想搭建一个专属于你的网站吗??新手向超详细攻略 搭建攻略 了解网站基本构成 购买域名 域名备案 购买服务器 配置域名解析 配置服务器 了解必要组件 进入webshell安装 进行环境配置 安装CMS系 ...

  9. JAVA 正则表达式 (超详细,转)

    转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...

  10. 超详细!K8s 面试知识点

    标题超详细!K8s 知识点 简述ETCD及其特点? etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的 ...

最新文章

  1. 《ADO.NET 2.0高级程序设计》读书随笔(1)使用连接池connection pool
  2. webstorm设置注释颜色_简单5步了解相关矩阵的注释热图
  3. Spring MVC-07循序渐进之验证器 下 (JSR 303验证)
  4. 虚拟DOM和Diff算法 - 入门级
  5. mybatis批量更新
  6. 修复Sonar中常见的Java安全代码冲突
  7. C++ 虚函数表解析(转)
  8. PAT 乙级 1042. 字符统计(20) Java版
  9. html drag 例子,html5 drag事件用法
  10. “蓝凤凰”开网店,卖起了这么多高颜值又神奇的生物
  11. java系列 - entity,vo转换
  12. 数据可视化的实现技术和工具比较(HTML5 canvas(Echart)、SVG、webGL等等)
  13. 使用MAC中碰到的各种问题
  14. Vulkan_Shader_Day01—光照(物体颜色)
  15. 离散数学 第十六章 环和域
  16. python软件工程师自我介绍_软件工程师求职自我介绍范文
  17. 鸿蒙内核为linux,现在linux改叫内核(非OS),安卓/iOS/鸿蒙才能被称为“操作系统 - 水木快照 JinghuaSoft...
  18. 监管大屏系统_煤矿安全监管系统可视化大屏展示设计
  19. 均线粘合突破选股指标公式:寻找启动点,并进行信号过滤
  20. 11.4 OSPF在帧中继网络中的配置

热门文章

  1. Kafka的消息模型
  2. 告别百度网盘,安装自己的专属网盘——Cloudreve,不限制下载速度!
  3. 大数据需要学习哪些技术?
  4. 安卓编译Release版本
  5. SpringBoot整合xxjobl
  6. 服务器信号有杂音怎么回事,直播有杂音是怎么回事?奉上原因及解决方法
  7. c++头文件iomanip.h中setw()、setprecision()、setbase用法示例详解
  8. 新唐 N76E003 单片机8051汇编 PWM测试程序
  9. 关于Mastering-OpenCV3第二版的代码跑通--关于PCL的一些问题
  10. 工作簿(Workbook)基本操作应用示例