做一个类似通讯录的增删改查功能

本文介绍如何创建一个通讯录应用,包括联系人类的设计、增删改查功能的实现,以及用户友好的界面。通过这个过程,展示了如何在Java中构建一个简单的联系人管理系统。
摘要由CSDN通过智能技术生成
要求 :完成一个通讯录
		需求: 
		(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();
	}

}

创建完毕,一个联系人的小功能就完成了!
(虽然只是一个联系人功能,但代码的写法却更贴合实际运用,在实现增删改查功能的同时我们也要设计一个更加合理且易操作的界面来让用户去实现功能)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
源码实现了如下功能: 1.2 系统功能分析 1.2.1 基本功能 支持以下信息的录入: (1)基本信息:姓名、手机号码、电话、电子邮箱、生日、所属组、备注、相片 (2)工作单位:国家、省份、城市、地址、工作单位、所属部门、职位、邮编、电话、传真 (3)网络信息:个人主页、即时通信工具及号码、备用邮箱 (4)家庭资料:国家、省份、城市、地址、邮编、电话 1.2.2 查询功能 (1)默认显示所有条目 (2)模糊查询:可以按姓名、姓名的汉语拼音的声母或全拼查询。支持模糊查询,即输入部分数据后,可以查询出符合条件的全部条目。如:输入“张”,列出所有名字中有“张”的条目;输入“xl”,列出声母为该2个字母的所有条目。 (写该实验报告时,暂未实现按手机号码、电话号码查询。) (3)指定分组后,列出某分组的所有条目。查询结果如果有多个条目,应按照姓名排序,并使用姓或姓的第一个汉语拼音的字母分类。 1.2.3 删除和修改功能 (1)选中单个联系人后,可以修改其内容,可以删除该联系人 (2)选中一个分组后,可以删除该分组,同时删除分组下的全部联系人 (3)支持情况账户下的所有联系人数据 1.2.4 导入和导出 支持将账户下的所有文本文档联系人数据导出为CSV格式文件,支持将CSV文件导入到账户,并能够与主流手机或其他通讯录软件交换数据。 1.2.5 通讯录的显示 显示查询结果,可以设置一个条目可以显示或不显示哪些内容。 1.2.6 通讯录数据的录入 对于新建联系人,保存时如果有同名或同电话号码时,给出提示。 1.2.7 联系人星标 支持一键收藏联系人,联系人加星标后更加方便于用户查找与管理。 【系统设计文档】、【系统需求分析文档】、【系统实验报告】、【答辩展示PPT】另见我的资源……
实现了以下要求说明的功能: 1.要求使用GUI,采用 Swing 技术数据存储采用文件系统(可以是文本 文件、xml 文件、vCard 文件或其他自定义格式文件,但不能是 Excel 文件)。不 使用数据库。 2. 通讯录中每个项目包括: ( 1)基本信息:姓名、手机号码、电子邮箱、生日、所属组、备注、像片。 ( 2)工作单位:国家、省份、城市、地址、工作单位、所属部门、职位、 邮编、电话、传真 ( 3)网络信息:个人主页、即时通信工具及号码、备用邮箱 ( 4)家庭资料:国家、省份、城市、地址、邮编、电话 3 .通讯录数据的录入功能:输入并存储新的通讯录数据,输入时如果有同 名或同电话号码时,应该给出提示。 4 .通讯录数据的查询功能: ( 1)默认列出所有条目。 ( 2)模糊查询,可以按:姓名、电话号码、手机、姓名的汉语拼音的声母 或全拼查询。支持模糊查询即输入部分数据后,可以查询出符合条件的全部条目。 如:输入“张”,列出所有名字中有“张”的条目;输入“ 2645”列出电话中有 该 4个数字的所有条目;输入“xl ”,列出声母为该 2 个字母的所有条目 ( 3)指定分组后,列出某分组的所有条目 说明:查询结果如果有多个条目,应按照姓名排序,并使用姓或姓的第一 个汉语拼音的字母分类。 5 .删除和修改功能查询一个条目后,可以删除该条目或修改条目内容。 6 .通信录内容的导入和导出功能。要求能够以CSV 格式和 vCard 格式导入 和导出通讯录的全部内容。并能够与主流手机或其他通讯录软件交换数据。 7 .通讯录显示设置,可以设置在显示查询结果时,一个条目可以显示或不 显示哪些内容。 注意:本系统实现了读取和保存csv文件,同时csv文件中只保存了图片的路径。
好的,我可以为您设计一个使用 MFC 编写的通讯录管理系统,满足您的要求。 首先,我们需要创建一个 MFC 对话框应用程序,然后在资源视图中添加一个菜单项和一个列表框。 接下来,我们需要在类视图中添加一个类,命名为 Contact,用于存储联系人的姓名、电话、地址等信息。代码如下: ```cpp class Contact { public: CString name; CString phone; CString address; }; ``` 然后,我们需要在类视图中添加一个类,命名为 ContactList,用于存储通讯录的名称和联系人列表,并且实现通讯录的增、删、改、查等功能。代码如下: ```cpp class ContactList { public: CString name; vector<Contact> contacts; // 新建通讯录 void create(CString name); // 保存通讯录 void save(); // 添加联系人 void add(Contact contact); // 删除联系人 void remove(int index); // 修改联系人 void modify(int index, Contact contact); // 查找联系人 vector<int> search(CString keyword); }; ``` 其中,create() 方法用于新建一个通讯录,save() 方法用于保存通讯录到文件中,add() 方法用于添加一个联系人,remove() 方法用于删除一个联系人,modify() 方法用于修改一个联系人,search() 方法用于根据关键字查找联系人,并返回匹配的联系人在联系人列表中的下标。 接下来,我们需要实现以上方法。代码如下: ```cpp // 新建通讯录 void ContactList::create(CString name) { this->name = name; contacts.clear(); } // 保存通讯录 void ContactList::save() { CStdioFile file; if (file.Open(name + ".txt", CFile::modeCreate | CFile::modeWrite)) { file.WriteString(name + "\n"); for (int i = 0; i < contacts.size(); i++) { CString line = contacts[i].name + " " + contacts[i].phone + " " + contacts[i].address + "\n"; file.WriteString(line); } file.Close(); } } // 添加联系人 void ContactList::add(Contact contact) { contacts.push_back(contact); } // 删除联系人 void ContactList::remove(int index) { contacts.erase(contacts.begin() + index); } // 修改联系人 void ContactList::modify(int index, Contact contact) { contacts[index] = contact; } // 查找联系人 vector<int> ContactList::search(CString keyword) { vector<int> result; for (int i = 0; i < contacts.size(); i++) { if (contacts[i].name.Find(keyword) != -1 || contacts[i].phone.Find(keyword) != -1 || contacts[i].address.Find(keyword) != -1) { result.push_back(i); } } return result; } ``` 以上代码中,save() 方法使用 CStdioFile 类打开文件并写入通讯录名称和联系人列表,add() 方法使用 vector 的 push_back() 方法添加一个联系人,remove() 方法使用 vector 的 erase() 方法删除一个联系人,modify() 方法直接替换指定下标的联系人,search() 方法使用 CString 的 Find() 方法查找匹配的联系人并返回下标列表。 接下来,我们可以在对话框的头文件中定义一个 ContactList 对象,并在对话框的代码中调用以上方法,实现通讯录管理系统的功能。例如,我们可以这样使用: ```cpp class CMyDlg : public CDialogEx { public: ContactList contactList; // 新建通讯录 void OnNew(); // 保存通讯录 void OnSave(); // 添加联系人 void OnAdd(); // 删除联系人 void OnRemove(); // 修改联系人 void OnModify(); // 查找联系人 void OnSearch(); }; ``` 以上代码中,我们在对话框类中定义了一个 ContactList 对象 contactList,并定义了 OnNew()、OnSave()、OnAdd()、OnRemove()、OnModify()、OnSearch() 等方法,用于实现通讯录管理系统的功能。 例如,我们可以这样实现 OnNew() 方法: ```cpp void CMyDlg::OnNew() { CInputDialog dlg(_T("新建通讯录"), _T("请输入通讯录名称:")); if (dlg.DoModal() == IDOK) { CString name = dlg.GetValue(); contactList.create(name); m_list.ResetContent(); SetWindowText(name); } } ``` 以上代码中,我们使用 CInputDialog 类创建一个对话框,用于输入通讯录名称,然后调用 contactList 的 create() 方法新建一个通讯录,清空列表框 m_list,并设置对话框标题为通讯录名称。 类似地,我们可以实现其他方法。最后,我们需要在菜单项的响应函数中调用相应的方法。例如,我们可以这样实现响应菜单项“新建”: ```cpp void CMyDlg::OnNew() { OnOK(); OnCancel(); OnNew(); } ``` 以上代码中,我们使用对话框的 OnOK()、OnCancel() 方法关闭对话框,并重新打开对话框的 OnNew() 方法,以实现新建通讯录功能。 这就是一个简单的使用 MFC 编写的通讯录管理系统的设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值