【数据结构】hash哈希表的介绍
应用实例:
有一个公司当有新员工来报道时,要求员工的信息加入(ID,姓名),当输入员工的ID时,要求查找到该员工所有信息。
1)不使用数据库——》哈希表(散列)
2)使用链表来实现哈希表,该链表不带表头
package com.fly.hashTable;
import java.util.Scanner;
/**
* @Title: 哈希表
* @author: Fly
* @date: 2020/4/5 - 19:31
*/
public class HashTabDemo {
public static void main(String[] args) {
HashTable hashTable = new HashTable(7);
String key="";
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("add:");
System.out.println("list:");
System.out.println("exit:");
key=scanner.next();
switch (key){
case "add":
System.out.println("输入id:");
int id=scanner.nextInt();
System.out.println("输入name:");
String name=scanner.next();
Emp emp = new Emp(id, name);
hashTable.add(emp);
break;
case "list":
System.out.println("显示雇员:");
hashTable.list();
break;
case "exit":
scanner.close();
}
}
}
static class HashTable {
private EmpLinkList[] empLinkLists;
private int size;
public HashTable(int size) {
this.size=size;
empLinkLists = new EmpLinkList[size];
//很多同学在这里跳坑
for (int i = 0; i < size; i++) {
empLinkLists[i] = new EmpLinkList();
}
}
public void add(Emp emp) {
//根据员工的id得到应当添加到哪条链表
int empLinkListNo = hashFun(emp.id);
empLinkLists[empLinkListNo].add(emp);
}
public int hashFun(int id){
return id%size;
}
//遍历链表
public void list(){
for (int i = 0; i < size; i++) {
EmpLinkList empLinkList = empLinkLists[i];
empLinkList.list(i);
}
}
}
static class Emp {
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
static class EmpLinkList {
private Emp head;
public void add(Emp emp) {
if (head == null) {
head = emp;
return;
}
Emp curEmp = head;
while (true) {
if (curEmp.next == null) {
break;
}
curEmp = curEmp.next;
}
curEmp.next = emp;
}
public void list(int i) {
if (head == null) {
System.out.println("当前链表为空");
return;
}
Emp cueEmp = head;
System.out.println("第"+(i+1)+"条链表:");
while (true) {
System.out.println(cueEmp.toString());
if (cueEmp.next == null) {
break;
}
cueEmp = cueEmp.next;
}
}
}
}