首页 > 编程知识 正文

HashTab的基本用法

时间:2023-05-03 23:29:55 阅读:230742 作者:174

哈希表

简介:又称为散列表,根据关键码值而直接进行访问的数据结构,也就是说,它通过吧关键码值映射到表中一个位置俩访问记录,以加快查找的速度,这个映射函数就叫做散列函数,存放记录的数组叫做散列表。

例题:需将员工的信息按照哈希表的存储方式进行存储需求分析:在保证效率的前提下不适用 数据库 借助第三方工具哈希表是最有效的方式:大致结构如下:(数组+链表)

代码如下: package HashTabDemo;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("show: 显示雇员");System.out.println("Find: 查找雇员");System.out.println("del: 删除雇员");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.add(emp);break;case "list":hashTab.show();break;case "find":System.out.println("请输入要查找的id");id = scanner.nextInt();hashTab.FindById(id);break;case "del":System.out.println("请输入你要删除的id");id = scanner.nextInt();hashTab.del(id);break;case "exit":scanner.close();System.exit(0);default:break;}}}}// 创建HashTab 管理多条链表class HashTab {private EMPLinkList[] link;private int size;// 定义数组的长度public HashTab(int size) {this.size = size;// 初始化操作 === 注意:要对每个数组单独进行初始化,不是一概而论link = new EMPLinkList[size];for (int i = 0; i < size; i++) {link[i] = new EMPLinkList();}}public void add(EMP e) {int id = e.id % size;link[id].add(e);}public void show() {for (int i = 0; i < size; i++) {link[i].show(i);}}public void FindById(int no) {int id = no % size;EMP e = link[id].FindById(id);if (e == null) {System.out.println("没有找到");} else {System.out.printf("在第%d条链表中找到 雇员 id = %dn", (id + 1), id);}}public void del(int no) {int id = no % size;boolean flag = link[id].del(id);if (flag == true) {} else {System.out.println("删除失败");}}}class EMP { // 创建链表的数据存储public int id;public String name;public EMP next;public EMP(int id, String name) { // 建造构造器 进行数据传输this.id = id;this.name = name;}}// 开始创建链表class EMPLinkList {private EMP head; // 借助辅助指针进行遍历 默认为NULL// 添加函数public void add(EMP e) {// 首先要对链表进行判断 头指针是否为空// 直接将数据接入到头指针if (head == null) {head = e;return;}// 如果不是第一个 则使用遍历 递归找到最后一个结点EMP cur = head;while (true) {if (cur.next == null) {break;}cur = cur.next;}// 退出时即找到位置所在 这时需要将结点加入到链表之中cur.next = e;}// 根据编号删除信息public boolean del(int no) {EMP cur = head;boolean flag = false;while (true) {// 分两种情况进行判断(找到,没有找到)if (cur.id == no) {flag = true;break;}if (cur.next == null) {cur = null;break;}cur = cur.next;}if (flag == true) {// System.out.println(cur.id);head = null;return true;} else {return false;}}// 根据编号查找信息public void show(int no) {if (head == null) {System.out.println("第 " + (no + 1) + " 链表为空");return;}EMP cur = head;System.out.println("第 " + (no + 1) + " 链表为:");while (true) {System.out.printf(" => id=%d name=%st", cur.id, cur.name);if (cur.next == null) {break; // 已经找到相应的位置}cur = cur.next;}System.out.println();}public EMP FindById(int no) {if (head == null) {System.out.println("null");}EMP cur = head;while (true) {// 分两种情况进行判断(找到,没有找到)if (cur.id == no) {break;}if (cur.next == null) {cur = null;break;}cur = cur.next;}return cur;}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。