有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息。要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)。

一、代码
import java.util.Scanner;public class HashTableDemo {public static void main(String[] args) {// 1. 创建一个哈希表HashTab hashTab = new HashTab(7);// 2. 测试菜单,根据用户的输入操作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:退出系统");key = scanner.next();switch(key) {case "add"://接收用户输入的信息System.out.println("输入雇员id:");int id = scanner.nextInt();System.out.println("输入名字:");String name = scanner.next();//创建雇员Emp emp = new Emp(id, name);//将雇员加入到HashTab中hashTab.add(emp);break;case "list"://调用哈希表的list方法hashTab.list();break;case "exit":scanner.close();System.exit(0);break;case "find":System.out.println("请输入要查找的id:");id = scanner.nextInt();hashTab.findEmpById(id);break;default:break;}}}}// 1. 创建HashTab,管理多条链表
class HashTab{// 1. 声明一个链表数组empLinkedListArray,这个链表数组的每个元素里面存放的都是链表private EmpLinkedList[] empLinkedListArray;private int size;//表示共有多少条链表,即数组的大小// 2. 构造器public HashTab(int size) {this.size = size;//初始化empLinkedListArrayempLinkedListArray = new EmpLinkedList[size];// 这里有一个坑!!!// 一定要分辨初始化每条链表for (int i = 0; i < size; i++) {empLinkedListArray[i] = new EmpLinkedList();}}// 3. 添加雇员public void add(Emp emp) {// 根据雇员的id,得到该员工应当添加到哪条链表int empLinkedListNo = hashFun(emp.id);// 将emp添加到对应的那条链表empLinkedListArray[empLinkedListNo].add(emp);}// 4. 编写一个散列函数,使用简单取模法//这个散列函数的作用,就是通过输入雇员id,找到该雇员听该放到哪条聊表public int hashFun(int id) {return id % size;}// 5. 遍历链表数组中的每条链表,即遍历哈希表public void list() {//共有size条链表for(int i = 0; i < size; i++) {empLinkedListArray[i].list(i);}}// 6. 根据输入的id,查找雇员public void findEmpById(int id) {int empLinkedListNo = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNo].findEmpById(id);if(emp != null) {System.out.printf("该雇员在第%d条链表\n", hashFun(emp.id));;}else {System.out.println("没有找到");}}}// 2. 编写一个Emp类,表示雇员,一个雇员相当于一个链表的节点
class Emp{// 1. 定义属性public int id;public String name;public Emp next;//next默认为 null// 2. 定义构造器public Emp(int id, String name) {this.id = id;this.name = name;}}// 3. 编写一个EmpLinkedList,表示链表,里面存放雇员信息
class EmpLinkedList{// 1. 定义一个头指针,指向第一个Emp,因此这个链表的head是直接指向链表的第一个节点private Emp head;//默认为null// 2. 添加雇员到链表// 说明// 1. 当添加雇员时, id是自增长的,即id得分配总是从小到大// 2. 因此新得雇员总是添加到链表最后public void add(Emp emp) {// 1. 当添加得是第一个雇员(节点)if(head == null) {//注意:head是头指针,是直接指向链表得第一个节点,当head==null时,就说明链表为空;当 head!=null时,说明链表非空,因为head指向了链表得第一个节点head = emp;return;}// 2. 当添加的不是第一个节点时//定义一个辅助指针,用来定位到链表最后Emp temp = head;//遍历链表,让temp指向最后一个节点while(true) {//当找到最后一个节点就退出循环if(temp.next == null) {//表示到了链表最后break;}//没到链表最后,就就继续遍历temp = temp.next;}//退出while循环后,temp就指向了最后一个节点temp.next = emp;}// 3. 显示链表(遍历输出每个节点)public void list(int no) {// 1. 空链表,退出方法if(head == null) {//注意:head是指针,不是节点,指针是指向某一个节点System.out.printf("第%d条链表为空\n", no);return;}// 2. 链表非空,遍历输出Emp temp = head;//定义一个辅助指针temp,与head指向同一个对象(节点)System.out.printf("第%d条链表的信息:", no);while(true) {// 1. 判断是否到达链表最后if(temp == null) {break;//输出完毕,退出循环}// 2. 没到最后,输出System.out.printf("-->id = %d name = %s\t", temp.id, temp.name);temp = temp.next;}//输出完一条链表后就换行System.out.println();}// 4.根据id查找雇员// 如果查到,就返回Emp;如果没有查到,就返回nullpublic Emp findEmpById(int id) {// 1. 先判断链表是否为空if (head == null) {System.out.println("链表为空");return null;// }// 2. 链表非空Emp temp = head;while(true) {// 1. 退出循环的条件if(temp == null) {//到达链表最后,且没有找到该雇员break;//退出循环}// 2. 不退出循环,继续找// 找到了if(temp.id == id) {break;//此时temp已经指向了要找的雇员}//没找到temp = temp.next;//后移}return temp;}
}
二、结果
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
0
输入名字:
jack
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
1
输入名字:
lusi
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
2
输入名字:
tom
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
3
输入名字:
nana
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
4
输入名字:
lulu
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
5
输入名字:
tick
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
6
输入名字:
mark
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
7
输入名字:
allen
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
add
输入雇员id:
8
输入名字:
jordan
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
lsit
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
list
第0条链表的信息:-->id = 0 name = jack  -->id = 7 name = allen
第1条链表的信息:-->id = 1 name = lusi  -->id = 8 name = jordan
第2条链表的信息:-->id = 2 name = tom
第3条链表的信息:-->id = 3 name = nana
第4条链表的信息:-->id = 4 name = lulu
第5条链表的信息:-->id = 5 name = tick
第6条链表的信息:-->id = 6 name = mark
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
find
请输入要查找的id:
0
该雇员在第0条链表
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
find
请输入要查找的id:
8
该雇员在第1条链表
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统
find
请输入要查找的id:
2
该雇员在第2条链表
add:添加雇员
list:显示雇员
find:查找雇员
exit:退出系统

Java数据结构与算法———(55)创建一个哈希表相关推荐

  1. Java数据结构和算法:HashMap,哈希表,哈希函数

    1. HashMap概述 HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所有 ...

  2. 【Java数据结构与算法】第十章 哈希表和二叉树

    第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...

  3. 10_JavaScript数据结构与算法(十)哈希表

    JavaScript 数据结构与算法(十)哈希表 认识哈希表 哈希表是一种非常重要的数据结构,几乎所有的编程语言都直接或者间接应用这种数据结构. 哈希表通常是基于数组实现的,但是相对于数组,它存在更多 ...

  4. JavaScript 数据结构与算法(二)哈希表

    本文参考文献:https://www.cnblogs.com/AhuntSun-blog/p/12636718.html 配套视频教程:https://www.bilibili.com/video/B ...

  5. 【数据结构与算法】五、哈希表和链表

    前言: 大家好,我是春风 今天继续刷左神的算法视频,前面刷完了入门的查找和排序算法,也对排序算法做了一些总结. 现在开始刷结构部分,第一个结构是哈希表,然后是链表.哈希表的应用在Java中有现成的ma ...

  6. Java数据结构与算法-----如何设计一个排队系统

    1.问题 设计一个排队系统,能够让每个进入队的用户都能看到自己在队列中所处的位置和变化.队列可能随时有人加入和退出,当有人退出时影响到用户的位置需要及时的反馈到用户. 2.问题分析: 不仅要实现队列常 ...

  7. Java数据结构与算法(二)

    Java数据结构与算法(二) 第六章 递归 1 递归应用场景 2 递归的概念 3 递归调用机制 4 递归能解决什么样的问题 5 递归需要遵守的重要规则 6 递归-迷宫问题 6.1 迷宫问题 6.2 代 ...

  8. Java 数据结构和算法(十五):无权无向图

    Java数据结构和算法(十五)--无权无向图 前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起 ...

  9. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

最新文章

  1. 5.7.4.framebuffer应用编程实践3
  2. 【盘它!】那些让效率MAX的工具和方法(Mac篇)
  3. 运行Qt release版本时出现“丢失QtCore4.dll”错误
  4. 关于linux挂载windows共享文件夹的试验
  5. 误删mysql数据库密码后,如何恢复密码
  6. [蓝桥杯2016决赛]阶乘位数-数论
  7. js读取服务器上的txt文件,javascript – 每15秒读取一次文本文件的内容
  8. php判断访问的当前设备是手机还是电脑
  9. python批量复制粘贴_用python批量复制特定图片
  10. 吐血整理,2021年最新【阿里、头条、美团】【软件测试】面试题(持续更新!)
  11. C# 将字节流转换为图片
  12. 【经验】lingo / lindo报错:invalid syntax
  13. 微服务架构的服务与发现-Spring Cloud
  14. 富文本功能实现vue3.0
  15. dubbo服务层面上的负载均衡和高可用
  16. zebradesginer zpl代码_斑马ZebraDesigner免费标签编辑软件
  17. ACL'22 | 陈丹琦提出CoFi模型剪枝,加速10倍,精度几乎无损
  18. 服务器上的word文件被锁定,Microsoft Word忽略从WebDAV服务器发送的锁定状态
  19. oracle 运维入门,Oracle日常基本运维命令及基本体系结构
  20. Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作

热门文章

  1. 人工智能人脸识别系统,人工智能应用人脸识别
  2. 微信登录58同城代码
  3. 厦门理工c语言课程设计,厦门理工学院+C语言+课程设计
  4. 目前口碑最好的电视机是哪款?看看真实用户怎么说
  5. 图论基础知识与常见图处理算法
  6. IE捉迷藏bug详解(躲猫猫)
  7. TimFin金融数据系统开发-软件工程部分(springboot+vue)
  8. Java将指定文件/文件夹压缩成zip、rar压缩文件
  9. 【uniapp+node.js】用户式加班计算器项目
  10. 【原创】python 字节流操作tga格式图像文件 先码后看,更新中