首页 > 其他分享 >11.哈希表

11.哈希表

时间:2022-12-03 16:24:30浏览次数:28  
标签:11 int id myHashTable Emp 哈希 null public

 

代码示例:
有三部分:
    1.员工实体Emp,里面有个重要的next属性,标注下一个员工
    2.员工链表EmpLinkedList,里面包含了head头部信息,以及链表的增删改查
    3.链表数组MyHashTable,暴露给上层调用的,里面会根据id定位到具体操作的链表,再进行基本操作
/**
 * 模拟hashTable
 */
public class HashTableDemo {
    public static void main(String[] args) {
        MyHashTable myHashTable = new MyHashTable(5);
        Emp emp1 = new Emp(1, "吴孟达", 18);
        Emp emp2 = new Emp(2, "刘丹", 19);
        Emp emp3 = new Emp(3, "吴振", 20);
        Emp emp6 = new Emp(6, "吴东霞", 20);
        myHashTable.add(emp1);
        myHashTable.add(emp2);
        myHashTable.add(emp3);
        myHashTable.add(emp6);
        myHashTable.list();
    }
}

class MyHashTable {
    private EmpLinkedList[] empLinkedLists;
    //数组大小
    private int size;

    public MyHashTable(int size) {
        this.size = size;
        empLinkedLists = new EmpLinkedList[size];
    }

    /**
     * 添加元素
     *
     * @param emp 添加的元素
     */
    public void add(Emp emp) {
        int index = emp.getId() % size;
        //获取对应下标的EmpLinkedList
        if (empLinkedLists[index] == null) {
            empLinkedLists[index]=new EmpLinkedList();
        }
        empLinkedLists[index].add(emp);
    }

    /**
     * 遍历
     */
    public void list() {
        for (int i = 0; i < empLinkedLists.length; i++) {
            if (empLinkedLists[i] != null) {
                System.out.println("数组:" + i);
                empLinkedLists[i].list();
            }
        }
    }
}

/**
 * 员工管理的链表
 */
class EmpLinkedList {
    private Emp head;

    /**
     * 添加元素
     *
     * @param emp 需要添加的元素
     */
    public void add(Emp emp) {
        if (head == null) {
            head = emp;
            return;
        }
        Emp curret = head;
        //查找链表的最后一个节点
        while (curret.getNext() != null) ;
        curret.setNext(emp);
    }

    /**
     * 遍历该链表
     */
    public void list() {
        if (head == null) {
            System.out.println("该链表为空!");
            return;
        }
        Emp curent = head;
        while (curent != null) {
            System.out.println(curent);
            curent = curent.getNext();
        }
    }
}

/**
 * 员工实体类
 */
class Emp {
    //员工id
    private int id;
    //员工名称
    private String name;
    //员工姓名
    private int age;
    //下一个节点
    private Emp next;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Emp(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Emp getNext() {
        return next;
    }

    public void setNext(Emp next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
输出:可以清晰看见链表数组的元素分布
    数组:0
    数组:1
    Emp{id='1', name='吴孟达', age=18}
    Emp{id='6', name='吴东霞', age=20}
    数组:2
    Emp{id='2', name='刘丹', age=19}
    数组:3
    Emp{id='3', name='吴振', age=20}
    数组:4

查找

1.链表类
    class EmpLinkedList {
      private Emp head;
        ...
            /**
         * 根据id查找emp
         *
         * @param id 查找的id
         * @return
         */
        public Emp getEmpById(int id) {
            if (head == null) {
                return null;
            }
            Emp curent = head;
            while (true) {
                if (curent.getId() == id) {
                    break;
                }
                //找到最后一个还不是,将current置为null返回
                if (curent.getNext() == null) {
                    curent = null;
                    break;
                }
                curent = curent.getNext();
            }
            return curent;
        }     
    }
    
2.链表数组类:
    class MyHashTable {
        private EmpLinkedList[] empLinkedLists;
        //数组大小
        private int size;
        ...
        public Emp getEmpById(int id) {
            int index = id % size;
            if (empLinkedLists[index] == null) {
                return null;
            }
            return empLinkedLists[index].getEmpById(id);
        }
        ...
    }
    
3.测试输出:
     public static void main(String[] args) {
        MyHashTable myHashTable = new MyHashTable(5);
        Emp emp1 = new Emp(1, "吴孟达", 18);
        Emp emp2 = new Emp(2, "刘丹", 19);
        Emp emp3 = new Emp(3, "吴振", 20);
        Emp emp6 = new Emp(6, "吴东霞", 20);
        myHashTable.add(emp1);
        myHashTable.add(emp2);
        myHashTable.add(emp3);
        myHashTable.add(emp6);
        myHashTable.list();
        System.out.println("------------------查找--------");
        Emp emp = myHashTable.getEmpById(6);
        if (emp == null) {
            System.out.println("没找到!");
        } else {
            System.out.println(emp.toString());
        }
    }
    
查找部分输出:
    ------------------查找--------
    Emp{id='6', name='吴东霞', age=20}

找一个没有的:Emp emp = myHashTable.getEmpById(100);
------------------查找--------
没找到!

更新和删除也是一样的套路!

标签:11,int,id,myHashTable,Emp,哈希,null,public
From: https://www.cnblogs.com/wmd-l/p/16948235.html

相关文章

  • 迅雷11SVIP下载,开发必备
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【2038】即可获取下载链接。......
  • Round #2022/11/26
    路径统计题目描述你有一棵\(n\)节点的树\(T\),回答\(m\)个询问,每次询问给你两个整数\(l\),\(r\),问存在多少个整数\(k\)使得从树上编号为\(l\)的点沿着\(l→r\)......
  • 问题解决系列:从源码讲解为什么是 'JZ0SL_ Unsupported SQL type 1111'
    一、问题场景正在做代码改造,使用​​mybatis​​​+​​sybase​​进行数据库操作,运行过程中,提示以下报错:java.io.IOException:JZ0SL:UnsupportedSQLtype1111.本篇博客......
  • 力扣 leetcode 11. 盛最多水的容器
    问题描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容......
  • 解决delphi10安卓app升级delphi11的问题
    解决delphi10安卓app升级delphi11的问题最近看delphi11比较稳定了,就主动安装了新版,但发现原来在delphi10.4.2下开发的安卓应用无法在新版下编译,主要情形如下:Libraries下......
  • win11右下角快捷面板打不开的处理方法
    win11右下角快捷面板打不开的处理方法在搜索中查询计算机管理(因为没有将此电脑放出来,所以就用搜索了)然后找到服务,找到windows推送通知系统服务,右键属性,将自动改为禁用,然......
  • 《XY618 4G 核心板》BOM全国产化,支持安卓11.0操作系统!
       产品概括:《XY6184G核心板》是深圳市新移科技有限公司基于紫光展锐T618(虎贲T618)平台所研发出的一款4G全网通智能模块,搭载了安卓11.0操作系统,BOM全国产化。该模块......
  • 11.25 闲话
    今天去了师大附中。好难过,很感慨,回家路上想了很多。想了想还是明天结束后再写吧,有空补个回忆录。来更新了。去试机的路上和jzp坐在一起看b站,不免感叹时光飞逝,两年......
  • 【2022-11-26】今日计划
    20:00天地间惟谦谨是载福之道,骄则满,满则倾矣。凡动口动笔,厌人之俗,嫌人之鄙,议人之短,发人之覆,皆骄也。无论所指未必果当,即使一一切当,已为天道所不许。      ......
  • 【2022-11-27】裸婚动力
    20:00一切福田,不离方寸;从心而觅,感无不通。                                       ......