思路分析
- 底层是链表+数组的结构
- 通过传入key值取余定到具体的链表上进行操作
package com.ran;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class Hello {
public static void main(String[] args) {
//创建哈希表
HashTab hashTab=new HashTab(3);
//写一个简单菜单来测试
String key="";
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("add:添加雇员");
System.out.println("list:显示雇员");
System.out.println("find:查找雇员");
System.out.println("delete:删除雇员");
System.out.println("exit:退出系统");
key=scanner.next();
switch (key){
case "add":
System.out.println("输入id");
int id=scanner.nextInt();
System.out.println("输入名字");
String name=scanner.next();
Emp emp = new Emp(id,name);
hashTab.zeng(emp);
break;
case "list":
hashTab.list();
break;
case "delete":
System.out.println("请输入要删除的用户id");
id=scanner.nextInt();
hashTab.shanchu(id);
break;
case "find":
System.out.println("请输入要查找的id");
id=scanner.nextInt();
hashTab.chazhao(id);
case "exit":
scanner.close();
System.exit(0);
default:
break;
}
}
}
}
//创建雇员
class Emp{
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
//创建哈希表
class HashTab{
private EmpList[] EmpListArray;
private int size; //表示共有多少条链表
//构造器
public HashTab(int size){
this.size=size;
//初始化EmpListArray
EmpListArray=new EmpList[size];
//这时不要忘了分别初始化每个链表
for(int i=0;i<size;i++){
EmpListArray[i]=new EmpList();
}
}
//添加雇员
public void zeng(Emp emp){
//根据员工id得到该员工应当添加到哪条链表
int EmpListNo=hashFun(emp.id);
//将emp添加到对应的链表中
EmpListArray[EmpListNo].add(emp);
}
public void shanchu(int id){
int no=hashFun(id);
EmpListArray[no].shanchu(id);
}
//遍历所有的链表,遍历哈希表
public void list(){
for(int i=0;i<size;i++){
EmpListArray[i].list();
}
}
//编写一个散列函数,使用一个简单的取模法
public int hashFun(int id){
return id % size;
}
//根据输入的id查找雇员
public void chazhao(int id){
//使用散列函数确定到哪条链表查找
int EmpListNo=hashFun(id);
Emp emp = EmpListArray[EmpListNo].chazhaoid(id);
if(emp!=null){
System.out.printf("在第%d条链表已找到 雇员id=%d name=%s\n ",EmpListNo,id,emp.name);
}else {
System.out.println("没有找到该雇员");
}
}
}
//创建雇员链表
class EmpList{
//头指针 指向第一个雇员,因此我们这个链表的head是直接指向第一个雇员的
private Emp head;
//添加雇员到链表
//说明
//1.假定 当添加雇员时,id自增,即id的分配总是从小到大
//因此我们将该雇员直接加入到链表的最后
public void add(Emp emp){
//如果是添加第一个员工
if(head==null){
head=emp;
return;
}
Emp temp=head;
while (true){
if(temp.next==null){
break;
}
temp=temp.next;
}
temp.next=emp;
}
//2.遍历链表
public void list(){
if(head==null){
System.out.println("空");
return;
}
Emp temp=head;
while (true){
System.out.printf("id=%d,name=%s\t",temp.id,temp.name);
if(temp.next==null){
break;
}
temp=temp.next;
}
}
//根据id查找雇员
//若果找到就返回emp 没找到就返回空
public Emp chazhaoid(int id){
if(head==null){
System.out.println("空");
return null;
}
Emp temp=head;
while (true){
if(temp.id==id){
break;
}
if(temp.next==null){
temp=null;
break;
}
temp=temp.next;
}
return temp;
}
public void shanchu(int id){
if(head==null){
System.out.println("空");
return;
}
if(head.id==id){
head=head.next;
return;
}
Emp temp=head;
boolean qq=false;
while (true){
if(temp.next==null){
break;
}
if(temp.next.id==id){
qq=true;
break;
}
temp=temp.next;
}
if(qq){
temp.next=temp.next.next;
}else {
System.out.println("mei zhaodao");
}
}
}
代码运行效果如下: