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)_数组+链表_代码实现员工管理相关推荐

  1. 数据结构:哈希表(散列表)基础

    哈希表(散列表)基础 引入哈希表 什么是哈西表: 一种具有相同特性的数据元素的集合,每个元素具有唯一标识自己的关键字. 基本原理: 说明: 顺序查找.二分查找或者二叉树的查找是基于待查关键字与表中元素 ...

  2. 2.10_hash_table_哈希表 / 散列表

    链表类 class LinkedList(object):"""链表类"""class Node(object):def __init__( ...

  3. 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数

    本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...

  4. 开局一张图帮你充分理解哈希表(散列表)

    目录 1哈希表的概念: 1.1哈希表的插入图示: 1.2哈希表的查询图示: 2.哈希冲突 2.1哈希冲突的概念: 2.2避免冲突 2.2.1哈希函数设计 2.2.2负载因子的调节 3.解决冲突 3.1 ...

  5. 算法小讲堂之哈希表|散列表|考研笔记

    文章目录 一. 基本概念 二. 哈希函数|散列函数 2.1 直接定址法 2.2 保留余数法 2.3 数字分析法 2.4 平方取中法 2.5 折叠法 2.6 随机数法 三.冲突处理 3.1 开放定址法 ...

  6. 哈希表(散列表)介绍

    目录 前言 一.哈希概念 1.1 什么时哈希表 1.2 哈希函数 1.3 哈希冲突 1.4 哈希冲突的解决 1.4.1 闭散列 1.4.2 开散列 1.4.3 问题 前言 哈希表时C++11两容器un ...

  7. JavaScript 哈希表(散列表)实现和应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

  8. 哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA 作者:Xuegui Chen 哈希是一种通过对数据 ...

  9. 设计散列表实现通讯录查找系统_[源码和文档分享]利用哈希表实现电话号码查询系统...

    第一章 需求分析 1.1 问题描述 设计一个电话号码查询系统,为来访的客⼈提供各种信息查询服务. 1.2 基本要求 设计每个记录有下列数据项:电话号码.用户名.地址 从键盘输入个记录,分别以电话号码和 ...

最新文章

  1. P1944 最长括号匹配(栈模拟/DP)
  2. java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
  3. L1-018 大笨钟
  4. 织梦系统中一篇文章存放在数据库中的哪些表中
  5. python棋子判定_python微信跳一跳系列之棋子定位颜色识别
  6. linux mysql配置修改_【Mysql】linux下mysql的配置修改
  7. Mac10.12开启NTFS读写
  8. 微软代码审查工具_微软代码审查的工作方式
  9. python3中expected an indented block(缩进问题)
  10. 图像质量评价 开源项目汇总
  11. android代码审计框架,路印协议已完成第三方代码安全审计
  12. STM32F7--->Internal Flash
  13. Dell台式机安装ubuntu系统
  14. 垂直居中对齐四种样式
  15. 读《枪炮,病菌和钢铁》
  16. CSV文件的导入和导出
  17. 【数据分析干货】全网最全!各行业常见的业务指标整理(四)-财务指标
  18. STM32中断优先级、FreeRTOS中断优先级,任务优先级
  19. 武汉大学计算机专业网络安全,武汉大学网络空间安全考研科目有哪些?
  20. FITC/TRITC/ICG/CY3/CY5/CY7/CY7.5荧光标记的Chondroitin-Sulfate硫酸软骨素、多糖、蛋白、多肽、氨基酸、药物、抗体

热门文章

  1. C#的DevExpress实现进度条
  2. python编程之变量如何自加i++
  3. 爱快软路由下载历史版本
  4. WARNING: This is a development server. Do not use it in a production deployment.
  5. C#中分割字符串输出字符数组
  6. java迭代器_java 迭代器
  7. 抽样分布:经常听到的卡方分布、t分布等的含义是啥?
  8. PS/2 标准键盘带感叹号,笔记本自带键盘不可用
  9. linux下shuf命令随即排序shuf -n1 a.txt
  10. linux 系统开启ssh连接