java 之 通讯录源码

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();
    }

}

猜你喜欢

转载自blog.csdn.net/KongLingLei_08225/article/details/82631216