java之hashTab


文章内容选自尚硅谷数据结构和算法,jdk11,eclipse环境

哈希表的用法

哈希表是一个链表数组,首先创建一个数组,数组的每一个元素都是链表的头结点,这儿链表的头结点直接存放第一个节点,而不是像之前的单链表一样,头结点指向第一个节点。

本文完成了原视频布置的作业,增加了删除节点的环节。

  • 哈希表的存放顺序是按照每一个节点的关键码值(key value),节点的关键码值决定该节点存放在哪一个链表中。
  • 哈希表单独作为一个对象(HashTab),当对哈希表作增删改查的时候,直接调用哈希表内的增删改查方法即可。要实现这一步,需要先创建一个链表对象(EmpLinkedList),当对哈希表作增删改查的时候,哈希表对象HashTab先根据key value找到要操作对象的链表位置,然后调用聊表对象EmpLinkedList的方法,对链表作增删改查。
  • 使用哈希表的优点是可以通过内存来操作数据,而避免采用数据库来操作数据,减轻数据库负担,增快了对数据的操作速度。
  • 哈希表可以做多级缓存。

代码演示如下:

package com.atguigu.hashtab;

import java.util.Scanner;

public class HashTabDemo {

	public static void main(String[] args) {
		HashTab hashTab = new HashTab(7);
		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("输入exit退出系统");
			System.out.println("输入del删除员工");
			key = scanner.next();
			switch(key) {
			case "add":
				System.out.println("请输入新员工的id");
				int id = scanner.nextInt();
				System.out.println("请输入新员工的name");
				String name = scanner.next();
				Emp tmp = new Emp(id,name);
				hashTab.addEmp(tmp);
				break;
			case "list":
				hashTab.listEmp();
				break;
			case "find":
				System.out.println("请输入要查找员工的id");
				int id2 = scanner.nextInt();
				hashTab.findId(id2);
				break;
			case "exit":
				scanner.close();
				System.exit(0);
			case "del":
				System.out.println("请输入要删除员工的id");
				int id3 = scanner.nextInt();
				hashTab.delId(id3);
				break;
			default:
				System.out.println("输入错误,请重新输入");
			}

		}

	}

}

class Emp{
	int id;
	String name;
	Emp next;
	public Emp(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
}

class EmpLinkedList{
	private Emp head;
	
	public void add(Emp emp) {
		if(head == null) {
			head = emp;  //直接把要添加的对象复制给head,不保留头指针
			return;
		}
		
		Emp curEmp;
		curEmp = head;
		while(curEmp.next != null) {
			curEmp = curEmp.next;
		}
		curEmp.next = emp;
	}
	
	public void list(int i) {
		if(head == null) {
			System.out.println("第"+(i+1)+"条链表为空");
			return;
		}
		Emp curEmp = head;
		while(curEmp.next != null) {
			System.out.printf("=>id = %d,name = %s\t",(curEmp.id),curEmp.name);
			curEmp = curEmp.next;
		}
		System.out.printf("=>id = %d,name = %s\t",(curEmp.id),curEmp.name);
		System.out.println();
	}
	
	public void findEmp(int id) {
		Emp curEmp = head;
		if(curEmp == null) {
			System.out.println("链表空,没有找到");
			return;
		}
		while(true) {
			if(curEmp.id == id) {
				System.out.println("找到了,name = "+curEmp.name);
				return;
			}
			if(curEmp.next == null) {
				curEmp = null;
				System.out.println("没有找到");
				return;
			}

			curEmp = curEmp.next;
		}
	}
	
	public void delEmp(int id) {
	Emp curEmp;
	curEmp = head;
	if(curEmp == null) {
		System.out.println("链表空,无法删除");
		return;
	}
	while(true) {
		if(curEmp.next== null) {
			if(curEmp == head && curEmp.id == id) {
				head = null;
				return;
			}else {
				System.out.println("没有找到要删除的id");
				return;
			}

		}
		if(curEmp.id == id && curEmp == head) {
			head = curEmp.next;
			return;
		}
		if(curEmp.next.id == id) {
			if(curEmp.next.next != null) {
				curEmp.next = curEmp.next.next;
				System.out.println("已删除id");
				return;
			}else {
				curEmp.next = null;
				return;
			}

		}
		curEmp = curEmp.next;
	}
}
}

class HashTab{
	EmpLinkedList[] empLinkedListArray ;
	int size;
	public HashTab(int size) {
		super();
		empLinkedListArray = new EmpLinkedList[size];
		this.size = size;
		for(int i = 0;i<empLinkedListArray.length;i++) {
			empLinkedListArray[i] = new EmpLinkedList();
		}
	}
	
	public int fun(int id) {
		return id % size;
	}
	
	public  void addEmp(Emp emp) {
		int empId = fun(emp.id);
		if(empId != 0)
			empLinkedListArray[empId-1].add(emp);
		else
			empLinkedListArray[6].add(emp);
	}
	
	public void listEmp() {
		for(int i = 0;i < empLinkedListArray.length;i++) {
			empLinkedListArray[i].list(i);
		}
	}
	
	public void findId(int id) {
		int empId = fun(id);
		if(empId != 0)
			empLinkedListArray[empId-1].findEmp(id);
		else
			empLinkedListArray[6].findEmp(id);
	}
	
	public void delId(int id) {
		int empId = fun(id);
		if(empId != 0)
			empLinkedListArray[empId-1].delEmp(id);
		else
			empLinkedListArray[6].delEmp(id);
	}
	
}

运行结果

输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
asgd
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
21
请输入新员工的name
asgdag
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
14
请输入新员工的name
agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
lilst
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 7,name = asgd =>id = 21,name = asgdag =>id = 14,name = agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
7
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 21,name = asgdag =>id = 14,name = agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
14
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 21,name = asgdag
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
21
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
asdgg
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
21
链表空,无法删除
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
第7条链表为空
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
asg
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 7,name = asg
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
7
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
第7条链表为空
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
1
请输入新员工的name
ahha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
4
请输入新员工的name
aahga
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
8
请输入新员工的name
ahahfa
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
llist
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
=>id = 1,name = ahha =>id = 8,name = ahahfa
第2条链表为空
第3条链表为空
=>id = 4,name = aahga
第5条链表为空
第6条链表为空
=>id = 7,name = agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
1
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
=>id = 8,name = ahahfa
第2条链表为空
第3条链表为空
=>id = 4,name = aahga
第5条链表为空
第6条链表为空
=>id = 7,name = agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
exit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值