1. 程式人生 > >java 之 通訊錄原始碼

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

}