要求 :完成一个通讯录
需求:
(1)添加联系人(联系人:编号,姓名,手机号,QQ,邮箱地址)添加时需要检查手机号和邮箱地址格式是否正确,若不正确,不允许添加
(2)联系人查询(输入姓名或电话查询)
(3)显示联系人列表
(4)根据编号删除指定编号的联系人
分析: 根据要求实现的功能我们需要创建一个联系人类,一个通讯录功能类,然后再需要一个入口去实现这些功能
首先,创建好联系人的变量(属性):
public class ContactManager {
private int num;
private String name;
private String phone;
private String qq;
private String email;
public Contact() {
// TODO Auto-generated constructor stub
}
public Contact(int num, String name, String phone, String qq, String email) {
super();
this.num = num;
this.name = name;
this.phone = phone;
this.qq = qq;
this.email = email;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Contact [num=" + num + ", name=" + name + ", phone=" + phone + ", qq=" + qq + ", email=" + email + "]";
}
}
待联系人类创建好了之后,我们需要创建一个方法类类去调用他们,达到对联系人增删改查的效果:
创建方法类:
public class ContactManager {
/**
* 存储所有联系人信息
*/
private static ArrayList<Contact> list = new ArrayList<>();
/**
* 添加联系人
*
* @param c
* @return
*/
public boolean add(Contact c) {
// ctrl+1
String phone = c.getPhone();
String qq = c.getQq();
String email = c.getEmail();
if (!phone.matches("^1\\d{10}$")) {
System.out.println("手机号格式不正确!");
return false;
}
if (!qq.matches("^[1-9]\\d{4,11}$")) {
System.out.println("QQ号格式不正确");
return false;
}
if (!email.matches("^\\w+?@.+?\\.\\w+$")) {
System.out.println("邮箱格式不匹配");
return false;
}
list.add(c);
return true;
}
/**
* 根据条件查询(模糊查询)
*
* @param flag 查询方式:1-按姓名 2-按手机号
* @param key 关键字
* @return
*/
public List<Contact> findByCondition(int flag, String key) {
// 声明临时变量存储查询到符合条件的数据
ArrayList<Contact> temp = new ArrayList<Contact>();
// 对联系人遍历
for (Contact c : list) {
if (flag == 1) {
// 按姓名(判断联系人姓名中是否包含指定的查询关键字)
if (c.getName().contains(key)) {
temp.add(c);
}
} else if (flag == 2) {
// 按手机号
if (c.getPhone().contains(key)) {
temp.add(c);
}
} else {
temp = list;
break;
}
}
return temp;
}
/**
* 查询所有(分页)
* @param pageNow 当前数据的页码数
* @param pageSize 每页数据的最大条目
* @return 返回当前页的数据集
*/
public List<Contact> findAll(int pageNow, int pageSize) {
//计算起始位置
int from = (pageNow - 1) * pageSize;
int to = pageNow * pageSize;
//如果集合中没有数据时返回null
if(list.size() < 1) {
return null;
}
//开始位置不能等于总数据条数(越界)
if(from >= list.size()) {
return null;
}
//结尾的位置不能超过数据总条数
if(to > list.size()) {
to = list.size();
}
return list.subList(from, to);
}
/**
* 根据编号删除联系人
* @param num
* @return
*/
public boolean del(int num) {
Contact target = null;
for(Contact c:list) {
if(c.getNum() == num) {
target = c;
break;
}
}
if(Objects.isNull(target)) {
System.out.println("未找到目标联系人");
return false;
}
return list.remove(target);
}
}
做到对联系人的增删改查之后,其实我们大半工作就已经完成了,接下来创建一个界面来使用他们:
Scanner input = new Scanner(System.in);
ContactManager cm = new ContactManager();
public void mainMenu() {
p("**********欢迎使用SOFTEEM-SMART通信录*******");
p("*\t[1]添加联系人\t\t\t*");
p("*\t[2]联系人列表\t\t\t*");
p("*\t[3]根据姓名查询联系人\t\t*");
p("*\t[4]根据手机号查询联系人\t\t*");
p("*\t[5]删除联系人\t\t\t*");
p("*\t[0]退出\t\t\t\t*");
p("*****************************************");
p("请输入正确的操作指令:");
//开始
start();
}
public void start() {
String s = input.next();
if(!s.matches("^[0-5]$")) {
p("请输入合法的操作指令");
start();
}
switch(s) {
case "1":
//添加联系人
addContact();
break;
case "2":
//联系人列表
listContact();
break;
case "3":
//查询联系人(by 姓名)
queryByCondition(1);
break;
case "4":
//查询联系人(by 手机号)
queryByCondition(2);
break;
case "5":
//删除联系人
delByNum();
break;
case "0":
//退出
p("谢谢使用,再见!");
System.exit(0);
break;
}
}
/**
* 删除联系人
*/
private void delByNum() {
p("请输入联系人的编号:");
String num = input.next();
if(!num.matches("^\\d+$")) {
p("请输入正确的编号");
delByNum();
}else {
boolean f = cm.del(Integer.parseInt(num));
if(f) {
p("删除成功");
}
mainMenu();
}
}
/**
* 条件查询
* @param flag
*/
private void queryByCondition(int flag) {
p("请输入查询关键字");
String key = input.next();
List<Contact> list = cm.findByCondition(flag, key);
//判断集合是否为空
if(list.isEmpty()) {
p("未查询到匹配的联系人!");
}else {
for(Contact c:list) {
p(c);
}
}
mainMenu();
}
/**
* 联系人列表
*/
private void listContact() {
p("请输入需要显示的联系人页码数和每页条数(按:页码/数据条数):");
String s = input.next();
if(!s.matches("\\d{1,3}/\\d{1,3}")) {
System.out.println("输入的页码或每页条数格式不正确");
listContact();
}else {
String[] nums = s.split("/");
List<Contact> list = cm.findAll(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]));
if(Objects.isNull(list)) {
p("没有更多数据可显示!");
mainMenu();
}else {
for (Contact c : list) {
p(c);
}
listContact();
}
}
}
/**
* 添加
*/
private void addContact() {
p("请输入联系人信息(按:编号/姓名/手机号/qq/邮箱)");
String s = input.next();
if(!s.matches("\\d+/.+/1\\d{10}/[1-9]\\d{4,11}/\\w+?@.+?\\.\\w+")) {
System.out.println("输入信息有误,请重新输入");
addContact();
}else {
String[] info = s.split("/");
//根据输入的信息构建联系人对象
Contact c = new Contact(Integer.parseInt(info[0]), info[1], info[2], info[3], info[4]);
if(cm.add(c)) {
p("添加成功!");
mainMenu();
}else {
addContact();
}
}
}
public void p(Object msg) {
System.out.println(msg);
}
public static void main(String[] args) {
new Client().mainMenu();
}
}
创建完毕,一个联系人的小功能就完成了!
(虽然只是一个联系人功能,但代码的写法却更贴合实际运用,在实现增删改查功能的同时我们也要设计一个更加合理且易操作的界面来让用户去实现功能)