java 之 通訊錄原始碼
阿新 • • 發佈:2018-12-09
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();
}
}