引入
- 谷歌問題:添加公司員工的個人信息(id、姓名),並且,能通過id查詢該員工的信息。
- 要求:不使用數據庫、速度越快越好=》哈希表(散列)
- 思路:建立三個類:員工信息節點類、單鏈表類、哈希表類
- 代碼:
package Hash;
import java.awt.RenderingHints.Key;
import java.util.Scanner;
import org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID;
public class HashTabDemo {
// 谷歌問題:添加公司員工的個人信息(id、姓名),並且,能通過id查詢該員工的信息。
// 要求:不使用數據庫、速度越快越好、 =》哈希表(散列)
// 思路:建立三個類:員工信息節點類、單鏈表類、哈希表類
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("請輸入待創建哈希表的長度:");
Scanner scanner = new Scanner(System.in);
int size = scanner.nextInt();
String key;
int id;
String name;
HashTab hashTab = new HashTab(size);
System.out.println("創建成功!");
while (true) {
System.out.println("add:添加");
System.out.println("delete:刪除");
System.out.println("list:展示所有節點信息");
System.out.println("show:展示單個節點信息");
System.out.println("update:更新單個節點信息");
System.out.println("exit:退出");
key = scanner.next();
switch (key) {
case "add":
System.out.println("請輸入節點id:");
id = scanner.nextInt();
System.out.println("請輸入節點name:");
name = scanner.next();
hashTab.add(id, name);
break;
case "delete":
System.out.println("請輸入待刪除節點id:");
id = scanner.nextInt();
hashTab.delete(id);
break;
case "list":
hashTab.list();
break;
case "show":
System.out.println("請輸入節點id:");
id = scanner.nextInt();
hashTab.show(id);
break;
case "update":
System.out.println("請輸入待更新節點id:");
id = scanner.nextInt();
System.out.println("請輸入待更新節點name:");
name = scanner.next();
hashTab.update(id, name);
break;
case "exit":
scanner.close();
System.exit(0);
default:
break;
}
}
}
}
//建立員工節點信息類
class Node {
private int id;
private String name;
private Node next;
public Node(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "Node [id=" + id + ", name=" + name + "]";
}
}
//建立單鏈表類
class InfoLinkedList {
private Node headNode;
private Node tempNode;
// 添加節點
public void add(Node node) {
if (headNode == null) {
headNode = node;
return;
}
tempNode = headNode;
while (tempNode.getNext() != null) {
tempNode = tempNode.getNext();
}
tempNode.setNext(node);
}
// 刪除
public void delete(int id) {
if (headNode == null) {
System.out.println("鏈表爲空,不能刪除!");
return;
}
tempNode = headNode;
if (tempNode.getId() == id) {
headNode = tempNode.getNext();
return;
}
while (tempNode.getNext() != null) {
if (tempNode.getNext().getId() == id) {
tempNode.setNext(tempNode.getNext().getNext());
return;
} else {
tempNode = tempNode.getNext();
}
}
System.out.println("未找到id爲" + id + "的節點,刪除失敗!");
return;
}
// 展示全部節點
public void list(int id) {
if (headNode == null) {
System.out.println("第" + (id + 1) + "個鏈表爲空,沒有信息!");
return;
}
System.out.print("第" + (id + 1) + "個鏈表:");
tempNode = headNode;
while (tempNode != null) {
System.out.printf("id==>%d,name==>%s ", tempNode.getId(), tempNode.getName());
tempNode = tempNode.getNext();
}
System.out.println();
}
// 查找節點
public Node show(int id) {
if (headNode == null) {
System.out.println("列表爲空,查找失敗!");
return null;
}
tempNode = headNode;
while (tempNode != null) {
if (tempNode.getId() == id) {
return tempNode;
}
tempNode = tempNode.getNext();
}
System.out.println("未找到id爲" + id + "的節點,查找失敗!");
return null;
}
// 修改單個節點
public void update(Node node) {
if (headNode == null) {
System.out.println("列表爲空,修改失敗!");
return;
}
tempNode = headNode;
while (tempNode != null) {
if (tempNode.getId() == node.getId()) {
tempNode.setName(node.getName());
return;
}
tempNode = tempNode.getNext();
}
System.out.println("未找到id爲" + node.getId() + "的節點,修改失敗!");
}
}
//建立哈希表
class HashTab {
private int size;
private InfoLinkedList[] infoLinkedListArray;
private int linkedListId;
public HashTab(int size) {
this.size = size;
infoLinkedListArray = new InfoLinkedList[size];
for (int i = 0; i < size; i++) {
infoLinkedListArray[i] = new InfoLinkedList();
}
}
// 通過id,獲的單鏈表的id
public int getLinkedListId(int id) {
return id % size;
}
// 添加節點
public void add(int id, String name) {
Node node = new Node(id,name);
linkedListId = getLinkedListId(node.getId());
infoLinkedListArray[linkedListId].add(node);
}
// 刪除節點
public void delete(int id) {
linkedListId = getLinkedListId(id);
infoLinkedListArray[linkedListId].delete(id);
}
// 查看所有節點信息
public void list() {
for (int i = 0; i < size; i++) {
infoLinkedListArray[i].list(i);
}
}
// 查找單個節點
public Node show(int id) {
linkedListId = getLinkedListId(id);
Node node = infoLinkedListArray[linkedListId].show(id);
System.out.println(node.toString());
return node;
}
// 修改單個節點
public void update(int id, String name) {
Node node = new Node(id,name);
linkedListId = getLinkedListId(node.getId());
infoLinkedListArray[linkedListId].update(node);
}
}