本周学习了一个通讯录的制作,对于目前的我来说,还蛮有难度的,一个综合性的题目,分享一下我的学习历程。
package keypoint5;
/**联系人类*/
public class Linkman {
/**编号*/
private int sno;
/**姓名*/
private String name;
/**手机号*/
private String number;
/**扣扣*/
private String qq;
/**邮箱地址*/
private String email;
public Linkman() {
}
public Linkman(int sno, String name, String number, String qq, String email) {
super();
this.sno = sno;
this.name = name;
this.number = number;
this.qq = qq;
this.email = email;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
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 "Linkman [sno=" + sno + ", name=" + name + ", number=" + number + ", qq=" + qq + ", email=" + email
+ "]";
}
}
package keypoint5;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**联系人管理类*/
public class LinkmanManage {
/**存储所有联系人信息*/
private static ArrayList<Linkman> list=new ArrayList<>();
/**添加联系人*/
public boolean add(Linkman lin){
String number=lin.getNumber();
String qq=lin.getQq();
String email=lin.getEmail();
if(!number.matches("^1\\d{10}$")){
System.out.println("手机号格式错误!!!");
return false;
}
if(!qq.matches("^[1-9]\\d{4,11}$")){
System.out.println("扣扣号格式错误!!!");
return false;
}
if(!email.matches("^\\w+?@.+?\\.\\w+$")){
System.out.println("邮箱格式不匹配!!!");
return false;
}
list.add(lin);
return true;
}
/**
* 根据条件查询(模糊查询)
* @param flag 查询方式:1-按照姓名查询 2-按照手机号查询
* @param key 关键字
* @return
*/
public List<Linkman> find(int flag,String key){
/**声明临时变量存储查询到符合条件的数据*/
ArrayList<Linkman> temp=new ArrayList<>();
for (Linkman lk : list) {
/**按照姓名*/
if(flag==1){
/**判断联系人姓名中是否包含指定的查询关键字*/
if(lk.getName().contains(key)){
temp.add(lk);
}
/**按照手机号*/
}else if (flag==2) {
if(lk.getNumber().contains(key)){
temp.add(lk);
}
}else {
temp=list;
break;
}
}
return temp;
}
/**
* 查询所有(分页)
* @param pageNow 当前数据的页码数
* @param pageSize 每页数据的最大条目数
* @return 返回当前的数据集合
*/
public List<Linkman> 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 sno
* @return
*/
public boolean del(int sno){
Linkman target=null;
for (Linkman l : list) {
if(l.getSno()==sno){
target=l;
break;
}
}
if(Objects.isNull(target)){
System.out.println("未找到目标联系人");
return false;
}
return list.remove(target);
}
}
package keypoint5;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;
/**客户端类*/
public class Client {
Scanner input=new Scanner(System.in);
LinkmanManage lk=new LinkmanManage();
public void p(Object msg){
System.out.println(msg);
}
public static void main(String[] args) {
new Client().mainMenu();
}
public void mainMenu(){
p("**********欢迎使用SOFTEEM-SMART**********");
p("*\t[1]添加联系人\t\t\t*");
p("*\t[2]联系人列表\t\t\t*");
p("*\t[3]根据姓名查询联系人\t\t\t*");
p("*\t[4]根据手机号查询联系人\t\t\t*");
p("*\t[5]删除联系人\t\t\t*");
p("*\t[0]退出\t\t\t\t*");
p("*************************************");
p("请输入正确的操作指令");
/**调用start*/
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;
default:
break;
}
}
/**
* 1.添加联系人
*/
private void addContact(){
p("请输入联系人信息(按:编号/姓名/手机号/qq/邮箱)");
String s=input.next();
if(!s.matches("\\d+/.+/1\\d{10}/[1-9]\\d{4,11}/\\w+?@.+?\\.\\w+")){
p("输入信息有误,请重新输入");
addContact();
}else {
String[] info=s.split("/");
/**根据输入的信息构建联系人对象*/
Linkman c=new Linkman(Integer.parseInt(info[0]), info[1], info[2], info[3], info[4]);
if(lk.add(c)){
p("添加成功!");
mainMenu();
}else {
addContact();
}
}
}
/**
* 2.联系人列表
*/
private void listContact() {
p("请输入需要显示的联系人页码数和每页条数(按:页码/数据条数):");
String s=input.next();
if(!s.matches("\\d{1,3}/\\d{1,3}")){
p("输入的页码或每页的条数格式不正确");
listContact();
}else {
String[] num=s.split("/");
List<Linkman> list=lk.findAll(Integer.parseInt(num[0]), Integer.parseInt(num[1]));
if(Objects.isNull(list)){
p("没有更多数据可显示!");
mainMenu();
}else {
for (Linkman lin : list) {
p(lin);
}
}
}
}
/**
* 3和4.条件查询
* @param flag
*/
private void queryByCondition(int flag) {
p("请输入查询关键字");
String key=input.next();
List<Linkman> list=lk.find(flag, key);
/**判断集合是否为空*/
if(list.isEmpty()){
p("为查询到匹配的联系人!");
}else {
for (Linkman lin : list) {
p(lin);
}
}
mainMenu();
}
/**
* 5.删除联系人
*/
private void delByNum() {
p("请输入联系人的编号:");
String num=input.next();
if(!num.matches("^\\d+$")){
p("请输入正确的编号");
delByNum();
}else {
boolean b=lk.del(Integer.parseInt(num));
if (b) {
p("删除成功!!!");
}
mainMenu();
}
}
}
最后控制台界面如下: