java哈希_java实现哈希表

这篇文章介绍了如何使用Java实现一个简单的哈希表(HashTab),用于管理雇员信息。通过HashTabDemo类,用户可以添加雇员(ID和姓名)、列出所有雇员、查找特定ID的雇员以及删除指定ID的雇员。核心部分包括哈希函数和链表操作,展示了数据结构在实际应用中的运用。
摘要由CSDN通过智能技术生成

public class HashTabDemo {

public static void main(String []args){

HashTab hashTab = new HashTab(7); //实例化一个有7条链表的哈希表

String key = "";

Scanner scanner = new Scanner(System.in);

while (true){

System.out.println("add:添加雇员");

System.out.println("list:显示雇员");

System.out.println("exit:退出");

System.out.println("find: 查找");

System.out.println("delete: 删除");

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);

hashTab.add(emp);

break;

case "list":

hashTab.list();

break;

case "find":

System.out.println("输入要查找的id:");

id = scanner.nextInt();

hashTab.fidEmpById(id);

break;

case "delete":

System.out.println("输入要删除雇员的id:");

id = scanner.nextInt();

hashTab.deleteById(id);

default:

break;

}

}

}

}

//员工

class Emp{

public String name;

public int id;

public Emp next = null;

public Emp(int id,String name){

this.id = id;

this.name = name;

}

}

//创建哈希表管理多条链表

class HashTab{

private LinkList [] linkListArray;

int size;//表示有多少条链表

public HashTab(int size){ //初始化链表条数

this.size = size;

linkListArray = new LinkList[size];

for (int i = 0;i < size; i++){

linkListArray [i] = new LinkList();

}

}

//哈希表添加雇员

public void add(Emp emp){

int linkListNO = hashFun(emp.id); //根据员工的id判断添加到哪条链表

linkListArray[linkListNO].add(emp);

}

public int hashFun(int id){ //散列函数,

return id % size;

}

//遍历哈希表

public void list(){

for (int i = 0; i < size; i++){

linkListArray[i].list(i);

}

}

//输入id查找雇员

public void fidEmpById(int id){

int likListNO = hashFun(id);

Emp emp = linkListArray[likListNO].findEmpById(id);

if (emp ==null){

System.out.println("没找到");

}

else{

System.out.println("在第"+likListNO+"条链表找到员工"+"id:"+emp.id+" "+"name:"+emp.name);

}

}

//输入id删除雇员

public void deleteById(int id){

int linkListNO = hashFun(id);

linkListArray[linkListNO].deleteById(id);

}

}

//创建链表

class LinkList{

private Emp head = null;

// 添加雇员

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 no){

if (head == null){

System.out.println("第"+no+"条链表为空");

return;

}

System.out.printf("第"+no+"条链表信息为:");

Emp curEmp = head;

while (true){

System.out.printf("->id:" + curEmp.id+" "+"name:" + curEmp.name+" ");

if (curEmp.next == null){ //遍历到最后节点退出循环

break;

}

curEmp = curEmp.next; //指针后移

}

System.out.println(); //输出第一条链表之后换行

}

//根据id查找雇员

//如果找到返回Emp,没找到返回空

public Emp findEmpById(int id){

if (head == null){

System.out.println("链表为空");

return null;

}

Emp curEmp = head;

while (true){

if (curEmp.id == id){

break; //找到了就退出循环将当前指针指向要查的雇员

}

if (curEmp.next == null){ //到最后一个节点,说明没找到

curEmp = null;

break;

}

curEmp = curEmp.next;

}

return curEmp;

}

// 删除雇员

public void deleteById(int id){

if (head == null){

System.out.println("链表为空");

return;

}

Emp curEmp = head;

while (true){

if (head.id == id){ //判断删除的是不是头节点

head = head.next;

System.out.println("删除成功");

break;

}else if (curEmp.next == null){ //下一个节点为空说明没有此id,下个节点不为空继续判断

System.out.println("要删除的雇员不存在");

break;

}else if (curEmp.next.id == id){

curEmp.next = curEmp.next.next; //删除指定id的节点

System.out.println("删除成功");

break;

}

curEmp = curEmp.next;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值