当前位置:   article > 正文

Java数据结构与算法——哈希表_java哈希表的使用

java哈希表的使用

1.关于哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。


2.代码案例

有一个公司,当有新的员工来报道时,要求将该员工的信息加入 (id,性别,年龄,名字,住址..),当输入该员工的id时,要求查找到该员工的 所有信息。

  1. package com.szh.hashtab;
  2. import java.util.Objects;
  3. import java.util.Scanner;
  4. /**
  5. * 哈希表
  6. */
  7. //雇员类
  8. class Employee {
  9. public int id;
  10. public String name;
  11. public Employee next;
  12. public Employee(int id, String name) {
  13. this.id = id;
  14. this.name = name;
  15. }
  16. }
  17. //创建EmpLinkedList, 表示链表
  18. class EmployeeLinkedList {
  19. //头指针,指向第一个Emp。因此我们这个链表的head 是直接指向第一个Emp
  20. private Employee head; //默认为null
  21. //添加雇员到链表
  22. //假定,当添加雇员时,id 是自增长,即id的分配总是从小到大,因此我们将该雇员直接加入到本链表的最后即可
  23. public void add(Employee employee) {
  24. //如果添加的是第一个雇员
  25. if (head == null) {
  26. head = employee;
  27. return;
  28. }
  29. //如果不是第一个雇员,则使用一个辅助的指针,帮助定位到最后
  30. Employee curEmp = head;
  31. while (true) {
  32. if (curEmp.next == null) { //此时说明已经到了链表的最后
  33. break;
  34. }
  35. curEmp = curEmp.next;
  36. }
  37. //最后将要添加的雇员放在链表的最后
  38. curEmp.next = employee;
  39. }
  40. //根据传入的no,确定要遍历哪条链表的雇员信息
  41. public void list(int no) {
  42. if (head == null) { //说明链表为空
  43. System.out.println("第 " + (no + 1) + " 链表为空....");
  44. return;
  45. }
  46. System.out.print("第 " + (no + 1) + " 链表的信息为: ");
  47. Employee curEmp = head; //辅助指针
  48. while (true) {
  49. System.out.printf(" => id = %d, name = %s\t", curEmp.id, curEmp.name);
  50. if (curEmp.next == null) { //说明curEmp已经是最后节点
  51. break;
  52. }
  53. curEmp = curEmp.next; //后移,遍历
  54. }
  55. System.out.println();
  56. }
  57. //根据id查找雇员
  58. //如果查找到,就返回Emp, 如果没有找到,就返回null
  59. public Employee findEmployeeById(int id) {
  60. //判断链表是否为空
  61. if (head == null) {
  62. System.out.println("链表为空....");
  63. return null;
  64. }
  65. //辅助指针
  66. Employee curEmp = head;
  67. while (true) {
  68. if (curEmp.id == id) { //找到了,此时curEmp就是要查找的雇员信息
  69. break;
  70. }
  71. if (curEmp.next == null) { //说明遍历当前链表没有找到该雇员
  72. curEmp = null; //没找到则将curEmp置为null
  73. break;
  74. }
  75. curEmp = curEmp.next; //向后移动
  76. }
  77. return curEmp;
  78. }
  79. }
  80. //创建HashTab,使用哈希表来管理多条链表
  81. class HashTab {
  82. private EmployeeLinkedList[] employeeLinkedLists;
  83. private int size; //表示共有多少条链表
  84. public HashTab(int size) {
  85. this.size = size;
  86. employeeLinkedLists = new EmployeeLinkedList[size];
  87. //这里需要分别初始化每条链表
  88. for (int i = 0; i < size; i++) {
  89. employeeLinkedLists[i] = new EmployeeLinkedList();
  90. }
  91. }
  92. //添加雇员
  93. public void add(Employee employee) {
  94. //根据员工的id,得到该员工应当添加到哪条链表
  95. int empLinkedListNo = hashFun(employee.id);
  96. //将emp添加到对应的链表中
  97. employeeLinkedLists[empLinkedListNo].add(employee);
  98. }
  99. //遍历所有的链表,即遍历哈希表
  100. public void list() {
  101. for (int i = 0; i < size; i++) {
  102. employeeLinkedLists[i].list(i);
  103. }
  104. }
  105. //根据输入的id,查找雇员
  106. public void findEmployeeById(int id) {
  107. //使用散列函数确定到哪条链表查找
  108. int empLinkedListNo = hashFun(id);
  109. Employee employee = employeeLinkedLists[empLinkedListNo].findEmployeeById(id);
  110. if (Objects.nonNull(employee)) { //找到
  111. System.out.printf("在第 %d 条链表中找到 雇员 id = %d\n", (empLinkedListNo + 1), id);
  112. } else { //未找到
  113. System.out.println("在哈希表中,没有找到该雇员~");
  114. }
  115. }
  116. //编写散列函数, 使用一个简单取模法
  117. public int hashFun(int id) {
  118. return id % size;
  119. }
  120. }
  121. public class HashTabDemo {
  122. public static void main(String[] args) {
  123. //创建哈希表
  124. HashTab hashTab = new HashTab(7);
  125. String key = "";
  126. Scanner scanner = new Scanner(System.in);
  127. while (true) {
  128. System.out.println("add: 添加雇员");
  129. System.out.println("list: 显示雇员");
  130. System.out.println("find: 查找雇员");
  131. System.out.println("exit: 退出系统");
  132. key = scanner.next();
  133. switch (key) {
  134. case "add":
  135. System.out.println("输入id: ");
  136. int id = scanner.nextInt();
  137. System.out.println("输入名字: ");
  138. String name = scanner.next();
  139. Employee employee = new Employee(id, name);
  140. hashTab.add(employee);
  141. break;
  142. case "list":
  143. hashTab.list();
  144. break;
  145. case "find":
  146. System.out.println("请输入要查找的id: ");
  147. id = scanner.nextInt();
  148. hashTab.findEmployeeById(id);
  149. break;
  150. case "exit":
  151. scanner.close();
  152. System.exit(0);
  153. default:
  154. break;
  155. }
  156. }
  157. }
  158. }

代码中的注释已经写的很清楚了,我就不再多说了,下面是测试相关截图。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/909205
推荐阅读
相关标签
  

闽ICP备14008679号