用java语言写hashtable 理解底层的原理
目前是 数组 + 链表组成的原理
如果代码有问题,希望在评论中指出,互相学习
主要的功能
添加 员工 删除 员工 显示 员工 查找 员工
```java
import java.util.HashMap;
import java.util.Scanner;
public class HashTableDemo {
public static void main(String[] args) {
int no;
String name;
Emp emp = null;
HashTable hashTable = new HashTable(7);
char key = ' ';
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("(a)add添加成员");
System.out.println("(s)show显示成员");
System.out.println("(e)exit退出程序");
System.out.println("(f)find查找成员");
System.out.println("(d)del删除成员");
key = scanner.next().charAt(0);
switch (key){
case 'a':
System.out.println("请输入学号");
no= scanner.nextInt();
System.out.println("请输入你的名字");
name = scanner.next();
emp = new Emp(no,name);
hashTable.addEmp(emp);
break;
case 's':
hashTable.showList();
break;
case 'f':
System.out.println("请输入学号");
int number = scanner.nextInt();
hashTable.findEmpByNo(number);
break;
case 'd':
System.out.println("请输入学号");
int nb = scanner.nextInt();
hashTable.delEmpByNo(nb);
break;
case 'e':
scanner.close();
System.exit(0);
default:
break;
}
}
}
}
class HashTable{
private LinkListEmp[] linkListEmps;
private int size;
public HashTable(int size){
linkListEmps = new LinkListEmp[size];
for (int i = 0; i<size;i++){
linkListEmps[i] = new LinkListEmp();
}
this.size = size;
}
public void addEmp(Emp newEmp){
int i = hashFun(newEmp.no);
linkListEmps[i].add(newEmp);
}
public int hashFun(int no){
return no%size;
}
public void showList(){
for (int i=0;i<size;i++){
linkListEmps[i].showList(i);
}
}
public void findEmpByNo(int no){
int i = hashFun(no);
Emp empByno = linkListEmps[i].findEmpByno(no);
if(empByno != null) {//找到
System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (i + 1), no);
}else{
System.out.println("在哈希表中,没有找到该雇员~");
}
}
public void delEmpByNo(int no){
int i = hashFun(no);
linkListEmps[i].delEmp(no);
}
}
class LinkListEmp{
Emp head = null;
public void add(Emp newEmp){
if (head == null){
head = newEmp;
return;
}
Emp curEmp = head;
while (true){
if (curEmp.next == null){
break;
}
curEmp = curEmp.next;
}
curEmp.next = newEmp;
}
//展示链表的
public void showList(int i){
if(head == null){
System.out.println("第 "+(i+1)+" 链表为空");
return;
}
System.out.print("第 "+(i+1)+" 链表的信息为");
Emp curEmp = head;
while (true){
System.out.printf(" => id=%d name=%s\t",curEmp.no,curEmp.name);
if (curEmp.next == null){
break;
}
curEmp = curEmp.next;
}
System.out.println();
}
public Emp findEmpByno(int no){
if (head == null){
System.out.println("链表为空,找不到你要的元素");
return null;
}
Emp curEmp = head;
while (true){
if (curEmp.no == no){
System.out.printf("%d号的元素被找到,他的名字叫%s",curEmp.no,curEmp.name);
break;
}
if (curEmp.next == null){
System.out.printf("%d号的元素无法被找到",curEmp.no);
break;
}
curEmp = curEmp.next;
}
return curEmp;
}
public void delEmp(int no){
if (head == null){
System.out.println("无此员工");
return;
}
if (head.no == no){
head = null;
return;
}
Emp curEmp = head;
while (true){
if (curEmp.next == null){
System.out.println("未找到元素,无法删除");
}
if (curEmp.next.no == no){
curEmp.next = curEmp.next.next;
break;
}
curEmp = curEmp.next;
}
}
}
class Emp{
public int no;
public String name;
public Emp next;
public Emp(int no,String name){
this.name = name;
this.no = no;
}
@Override
public String toString() {
return "Emp{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}