哈希表(散列表_Hashtable)_数组+链表_代码实现员工管理
1、基本介绍
- 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
2、实际需求
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,姓名,住址.),当输入该员工的id时,要求查找到该员工的所有信息.
要求:
- 不使用数据库,尽量节省内存,速度越快越好 => 哈希表(散列)
- 添加时,保证按照id从低到高插入
实现:
- 使用【 数组+链表】 来实现哈希表, 数组中的元素存放对应的链表
- 链表不带表头 [即:链表的第一个结点就存放雇员信息]
3、代码实现
import java.util.Scanner;public class HashTableDemo {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("delete:删除雇员");System.out.println("list:显示雇员");System.out.println("find:查找系统");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();//创建雇员Employee employee = new Employee(id, name);hashTable.add(employee);break;case "delete":System.out.println("请输入id");id = scanner.nextInt();hashTable.deleteEmployee(id);break;case "list":hashTable.list();break;case "exit":scanner.close();System.exit(0);case "find":System.out.println("请输入id");id = scanner.nextInt();hashTable.findEmployeeById(id);break;default:break;}}}
}//创建HashTable 管理多条链表
class HashTable {private EmployeeLinkedList[] employeeLinkedListArray;private int size; //表示数组的长度,即有多少条链表//构造器public HashTable(int size){this.size = size;//初始化employeeLinkedListArrayemployeeLinkedListArray = new EmployeeLinkedList[size];//这时要初始化每个链表,将每条链表添加到数组里for (int i = 0; i < size; i++) {employeeLinkedListArray[i] = new EmployeeLinkedList();}}//添加雇员public void add(Employee employee){//根据雇员的id得到该雇员应当添加到哪条链表int employeeLinkedListNo = hashFun(employee.id);//将employee 添加到对应的链表中employeeLinkedListArray[employeeLinkedListNo].add(employee);}//遍历所有的链表,遍历hashtablepublic void list(){for (int i = 0; i < size; i++) {employeeLinkedListArray[i].list(i);}}//根据输入的id,查找雇员public void findEmployeeById(int id){//使用散列函数确定到哪条链表查找int employeeLinkedListNo = hashFun(id);Employee employee = employeeLinkedListArray[employeeLinkedListNo].findEmployeeById(id);if(employee!=null){ //找到System.out.printf("在第%d条链表中找到雇员 id=%d\n",(employeeLinkedListNo+1),id);}else{System.out.println("在哈希表中,没有找到该雇员");}}//根据id删除雇员public void deleteEmployee(int id){int employeeLinkedListNo = hashFun(id);employeeLinkedListArray[employeeLinkedListNo].deleteEmployee(id);}//编写散列函数,使用一个简单的取模法public int hashFun(int id){return id % size;}
}//定义一个表示雇员的结点类
class Employee{public int id;public String name;public Employee next; public Employee(int id, String name) {this.id = id;this.name = name;}
}//创建EmployeeLinkedList,表示链表,用于实现对链表操作的方法
class EmployeeLinkedList{//头指针,因此这个链表的head是直接指向第一个Employeeprivate Employee head; //添加雇员到链表/*说明假定,当添加雇员时,id是自增长,即id的分配总是从小到大因此将该雇员直接加入到本链表的最后即可*/public void add(Employee employee){//如果是添加第一个雇员if(head==null){head = employee;return;}//如果不是第一个雇员,则使用一个辅助的指针,辅助定位到最后Employee curEmployee = head;while(curEmployee.next!=null){curEmployee = curEmployee.next;}//退出时直接将employee加入链表curEmployee.next = employee;}//遍历链表的雇员信息public void list(int no){if(head==null){//说明链表为空System.out.println("第"+(no+1)+"链表为空");return;}System.out.print("第"+(no+1)+"链表的信息为");Employee curEmployee = head;while(true){System.out.printf("=> id=%d name=%s \t",curEmployee.id,curEmployee.name);if(curEmployee.next==null){break;}curEmployee = curEmployee.next;}System.out.println();}//根据id查找雇员//如果查找到,就返回Employee,如果没有找到,就返回nullpublic Employee findEmployeeById(int id){if(head==null){System.out.println("链表为空");return null;}Employee curEmployee = head;while(true){if(curEmployee.id == id){ //找到break;//这时curEmployee就指向要查找的雇员}if(curEmployee.next==null){ //说明遍历当前链表没有找到该雇员curEmployee = null;break;}curEmployee = curEmployee.next;}return curEmployee;}//根据id删除雇员//其他方式:新建一个头头结点指向headpublic void deleteEmployee(int id){if(head==null){System.out.println("链表为空");return;}//仅有一个结点时,删除链表的第一个结点if(head.next == null){head = null;return;}//有多个结点时,删除第一个结点if(head.id == id){head = head.next;return;}Employee curEmployee = head;while(true){if(curEmployee.next == null){System.out.println("没有找到");break;}if(curEmployee.next.id == id){curEmployee.next = curEmployee.next.next;break;}curEmployee = curEmployee.next;}}
}
哈希表(散列表_Hashtable)_数组+链表_代码实现员工管理相关推荐
- 数据结构:哈希表(散列表)基础
哈希表(散列表)基础 引入哈希表 什么是哈西表: 一种具有相同特性的数据元素的集合,每个元素具有唯一标识自己的关键字. 基本原理: 说明: 顺序查找.二分查找或者二叉树的查找是基于待查关键字与表中元素 ...
- 2.10_hash_table_哈希表 / 散列表
链表类 class LinkedList(object):"""链表类"""class Node(object):def __init__( ...
- 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数
本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...
- 开局一张图帮你充分理解哈希表(散列表)
目录 1哈希表的概念: 1.1哈希表的插入图示: 1.2哈希表的查询图示: 2.哈希冲突 2.1哈希冲突的概念: 2.2避免冲突 2.2.1哈希函数设计 2.2.2负载因子的调节 3.解决冲突 3.1 ...
- 算法小讲堂之哈希表|散列表|考研笔记
文章目录 一. 基本概念 二. 哈希函数|散列函数 2.1 直接定址法 2.2 保留余数法 2.3 数字分析法 2.4 平方取中法 2.5 折叠法 2.6 随机数法 三.冲突处理 3.1 开放定址法 ...
- 哈希表(散列表)介绍
目录 前言 一.哈希概念 1.1 什么时哈希表 1.2 哈希函数 1.3 哈希冲突 1.4 哈希冲突的解决 1.4.1 闭散列 1.4.2 开散列 1.4.3 问题 前言 哈希表时C++11两容器un ...
- JavaScript 哈希表(散列表)实现和应用
查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...
- 哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA 作者:Xuegui Chen 哈希是一种通过对数据 ...
- 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...
第一章 需求分析 1.1 问题描述 设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务. 1.2 基本要求 设计每个记录有下列数据项:电话号码.用户名.地址 从键盘输入个记录,分别以电话号码和 ...
最新文章
- P1944 最长括号匹配(栈模拟/DP)
- java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
- L1-018 大笨钟
- 织梦系统中一篇文章存放在数据库中的哪些表中
- python棋子判定_python微信跳一跳系列之棋子定位颜色识别
- linux mysql配置修改_【Mysql】linux下mysql的配置修改
- Mac10.12开启NTFS读写
- 微软代码审查工具_微软代码审查的工作方式
- python3中expected an indented block(缩进问题)
- 图像质量评价 开源项目汇总
- android代码审计框架,路印协议已完成第三方代码安全审计
- STM32F7--->Internal Flash
- Dell台式机安装ubuntu系统
- 垂直居中对齐四种样式
- 读《枪炮,病菌和钢铁》
- CSV文件的导入和导出
- 【数据分析干货】全网最全!各行业常见的业务指标整理(四)-财务指标
- STM32中断优先级、FreeRTOS中断优先级,任务优先级
- 武汉大学计算机专业网络安全,武汉大学网络空间安全考研科目有哪些?
- FITC/TRITC/ICG/CY3/CY5/CY7/CY7.5荧光标记的Chondroitin-Sulfate硫酸软骨素、多糖、蛋白、多肽、氨基酸、药物、抗体
热门文章
- C#的DevExpress实现进度条
- python编程之变量如何自加i++
- 爱快软路由下载历史版本
- WARNING: This is a development server. Do not use it in a production deployment.
- C#中分割字符串输出字符数组
- java迭代器_java 迭代器
- 抽样分布:经常听到的卡方分布、t分布等的含义是啥?
- PS/2 标准键盘带感叹号,笔记本自带键盘不可用
- linux下shuf命令随即排序shuf -n1 a.txt
- linux 系统开启ssh连接