1️⃣联系人类
package com.kll.LinkMan;
public class LinkMan {
//联系人:姓名 年龄 性别 地址 电话
private String name = null;
private int age = 0;
private String gander = null;
private String address = null;
private String phone = null;
//构造方法
public LinkMan() {
super();
// TODO Auto-generated constructor stub
}
public LinkMan(String name, int age, String gander, String address, String phone) {
super();
this.name = name;
this.age = age;
this.gander = gander;
this.address = address;
this.phone = phone;
}
//重写sete/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGander() {
return gander;
}
public void setGander(String gander) {
this.gander = gander;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
//重写 toString方法
@Override
public String toString() {
return "[name=" + name + ", age=" + age + ", gander=" + gander + ", address=" + address + ", phone="
+ phone + "]";
}
}
2️⃣联系人管理类
package com.kll.LinkMan;
import java.security.acl.Group;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.TreeMap;
import java.util.TreeSet;
import com.lanou3g.bean.Pinyin4jUtil;
//按姓名排序
class CompareName implements Comparator<LinkMan>{
@Override
public int compare(LinkMan o1, LinkMan o2) {
int rel = o1.getName().compareTo(o2.getName());
return rel == 0 ? 1 : rel;
}
}
//按年龄排序
class CompareAge implements Comparator<LinkMan>{
@Override
public int compare(LinkMan o1, LinkMan o2) {
int rel = o2.getAge() - o1.getAge();
return rel == 0 ? 1 : rel;
}
}
public class LinkManManager {
private TreeMap<String, ArrayList<LinkMan>> map;
//构造方法
public LinkManManager() {
//初始化
this.map = new TreeMap<>();
}
/*
* 添加联系人
* 1. 直接添加 A-Z 和对应的26个小集合
* 2.有联系人时 再创建该联系人的分组
* 没有这个分组
* 创建一个新的list 把人 放进去
* 再放入大map中
* 该分组已存在
* 把list取出来 再把人 放进去
* 再把list放入map中
*
*/
public void addLinkMan(LinkMan man) {
// 判断 输入的人 是否存在
if (man == null || man.getName() == null) {// 判断人的信息是否给全了
System.out.println("人的格式输入错误,请重新输入!");
return;
}
// 取首字母
String key = Pinyin4jUtil.getFirstLetter(man.getName());
// 判断首字母是否 在map中
if (!this.map.containsKey(key)) {
// 不在时 创建集合list 把人加入集合list中
ArrayList<LinkMan> list = new ArrayList<>();
list.add(man);
//把list 加入到 map中
this.map.put(key, list);
}else {
// 存在时 取出list 把人 加入list中
ArrayList<LinkMan> list = this.map.get(key);
// 因为 地址一样 所以赋完值 之后 不需要再放入map中
list.add(man);
}
}
// 打印 map集合
public void printMap() {
for (String key : this.map.keySet()) {
ArrayList<LinkMan> list = this.map.get(key);
System.out.println(key + "分区");
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
}
}
//1.根据分组查找联系人 并针对姓名进行排序
public void findLinkManByGroup(String group) {
// 判断 map 是否为空
if (! (this.map.isEmpty() || group == null || group.isEmpty())) { //存在时
// 大写转小写
String key = group.toUpperCase();
//判断 map是否包含 该key
if (this.map.containsKey(key)) {
// 如果 包含 取出 该list
ArrayList<LinkMan> list = this.map.get(key);
//创建 treeSet 进行排序
TreeSet<LinkMan> set = new TreeSet<>(new CompareName());
set.addAll(list);
// 打印set
printSet(set);
}else {
System.out.println("没有" + key + "分组");
}
}else {
// 为空 或者 空指针时
System.out.println("没有联系人");
return;
}
}
// 打印set方法
private void printSet(TreeSet<LinkMan> set) {
for (LinkMan linkMan : set) {
System.out.println(linkMan);
}
}
//2.根据电话输出联系人信息 13811554605 遍历大map
public void findLinkManByPhone(String phone) {
// 判断输入是否为空
if (! (phone == null || phone.isEmpty())) {
// 不为空时
// 声明 linkman 为空 存储 结果
LinkMan linkMan = null;
// 遍历 map
for (String key : this.map.keySet()) {
// 取出 list
ArrayList<LinkMan> list = map.get(key);
// 遍历 list
for (LinkMan linkMan2 : list) {
// 判断 电话号码是否存在
if (linkMan2.getPhone().equals(phone)) {
//存在时
linkMan = linkMan2;
}
}
}
// 对 linkman进行判断
if (linkMan == null) {
// 为空时
System.out.println(phone + "不存在");
}else {
System.out.println(linkMan);
}
}else {
// 为空时
System.out.println("输入为空,有误!");
return;
}
}
//3.根据性别查找该性别的所有联系人 并且按照年龄降序排序
public void findLinkMansByGander(String gander) {
// 判断性别输入
if (! (gander.equals("男") || gander.equals("女")) || gander == null) {
//性别输入有误时
System.out.println("性别输入有误!");
return;
}else {
// 输入 正确时
// 声明list 存储同性别的人
ArrayList<LinkMan> list = new ArrayList<>();
// 遍历大集合
for (String key : this.map.keySet()) {
// 取出key对应的value
ArrayList<LinkMan> list2 = this.map.get(key);
// 遍历 list2
for (LinkMan man : list2) {
// 判断 性别
if (man.getGander().equals(gander)) {
// 性别 与所输入性别相同时
// list集合 保存该人
list.add(man);
}
}
}
// 判断 集合长度 来确定 改性的人 有没有
if (list.isEmpty()) {
// 为空时 说明 没改性别的人
System.out.println("没有性别为:" + gander + "的人");
}else {
// 不为空时 说明 有
// 声明treeSet 进行排序
TreeSet<LinkMan> set = new TreeSet<>(new CompareAge());
set.addAll(list);
// 打印set
printSet(set);
}
}
}
//4.根据姓名删除某个联系人
/*
* 没有改用户
* 提示客户
* 有该联系人
* 将该联系人在分区中删除
* 删除后 分区中是否还有人?
* 1. 有人 不管
* 2. 没人 删除key值
*/
public void delectLinkManByNAme(String name) {
// 判断 输入为空 否
if (! (name == null || name.isEmpty())) {
// 输入不为空 时
// 取出名字首字母
String key = Pinyin4jUtil.getFirstLetter(name);
// 判断 map中包含的有没有 该首字母
if (this.map.containsKey(key)) {
// 包含时
// 取出 该字母对应的 value值集合
ArrayList<LinkMan> list = this.map.get(key);
// 遍历 删除
// 取出迭代器
ListIterator<LinkMan> iterator = list.listIterator();
// 遍历
while (iterator.hasNext()) {
LinkMan man = iterator.next();
// 判断姓名是否相等
if (man.getName().equals(name)) {
// 输入 和 遍历人名相等时
iterator.remove();
System.out.println(man);
}
}
if (list.isEmpty()) {
// 为空时 移除分区
this.map.remove(key);
}
}else {
// 不包含时
System.out.println(name + "不存在" + key + "分区");
}
}else {// 格式输入有误时
System.out.println("姓名 格式输入有误");
}
}
// 5.删除某个分区的所有联系人 传入B 把姓B的全删了
public void delectLinkManByGroup(String group) {
// 判断 group 的输入
if (! (group == null || group.isEmpty())) {
// 当输入不为空时
// 转大写
String key = group.toUpperCase();
// 判断输入的字符是否存在map中
if (this.map.containsKey(key)) {
// 存在map中时 删除
//System.out.println(this.map.get(key));
this.map.remove(key);
return;
}else {
// 不存在时
System.out.println(key + "分区不存在");
return;
}
}else {
// 为空时
System.out.println("分区输入错误!");
}
}
// 6.修改联系人
/*
* 找到
* 改名 不改姓
* 改姓 原来的删除 判断删除后 是否为空
* 添加新的 判断分组 是否已经存在
* 未找到
*/
public void changeLinkMan(String oldName, String newName) {
// 取 新旧分区
String oldKey = Pinyin4jUtil.getFirstLetter(oldName);
String newKey = Pinyin4jUtil.getFirstLetter(newName);
// 寻找老名字的联系人
LinkMan oldMan = null;
// 判断 旧的人的分区是否存在
if (!this.map.containsKey(oldKey)) {
// 不存在时,提示
System.out.println("Sorry," + oldKey + " 分区不存在" + oldName + " 输入错误");
return;
}
// 取出旧分区
ArrayList<LinkMan> oldList = this.map.get(oldKey);
// 遍历旧分区
for (LinkMan linkMan : oldList) {
if (linkMan.getName().equals(oldName)) {
// 包含时 记录联系人
oldMan = linkMan;
}
}
// 判断 是否有这个人
if (oldMan == null) {
// 为空时
System.out.println("没有" + oldName + " 联系人");
return;
}else {// 不为空时
// 判断是否在同一个分区
if (oldKey.equals(newKey)) {
// 在同一个分区时 直接修改
oldMan.setName(newName);
}else {
// 不在同一个分区
LinkMan newMan = new LinkMan(newName, oldMan.getAge(),
oldMan.getGander(), oldMan.getAddress(),
oldMan.getPhone());
// 删除老的
delectLinkManByNAme(oldName);
// 添加新的
addLinkMan(newMan);
}
}
}
}
//创建联系人类 和 通讯录管理类 使用map和list实现 key -char value ArrayList
//联系人:姓名 年龄 性别 地址 电话
//通讯录管理类:
//1.根据分组查找联系人 并针对姓名进行排序
//例如 传入B分组 查找出 B分组下 姓名首字母是B的所有联系人
//2.根据电话输出联系人信息 13811554605 遍历大map
//3.根据性别查找该性别的所有联系人 并且按照年龄降序排序
//4.根据姓名删除某个联系人
//5.删除某个分区的所有联系人 传入B 把姓B的全删了
//6.修改联系人
3️⃣测试类
package com.kll.LinkMan;
public class Test {
public static void main(String[] args) {
// 添加方法测试
LinkManManager manager = new LinkManManager();
manager.addLinkMan(new LinkMan("啦啦", 22, "女", "北京", "12345678901"));
manager.addLinkMan(new LinkMan("加加", 22, "女", "北京", "12302067890"));
manager.addLinkMan(new LinkMan("哒哒", 22, "女", "北京", "16945678901"));
manager.addLinkMan(new LinkMan("哒哒", 22, "女", "北京", "16945678901"));
manager.addLinkMan(new LinkMan("嘟嘟", 22, "女", "北京", "16945678901"));
manager.addLinkMan(new LinkMan());
// 打印map方法测试
manager.printMap();
// 根据分组 打印联系人 按姓名 测试
manager.findLinkManByGroup(null);
// 根据电话号码 输出联系人 测试
//manager.findLinkManByPhone("16945678901");
System.out.println(new LinkMan());
System.out.println("++++");
// 根据性别 打印改性别联系人 按年龄分组
manager.findLinkMansByGander("男");
// 测试 根据姓名删除某个联系人
manager.delectLinkManByNAme("哒哒");
manager.printMap();
System.out.println("------");
// 测试 分区删除
manager.delectLinkManByGroup(null);
manager.printMap();
System.out.println("*******");
// 测试 更改联系人
manager.changeLinkMan("哈哈", "了");
//manager.printMap();
}
}