数据结构与算法st10:查找算法学习之哈希表(散列表)

在这里插入图片描述
哈希表用来作为缓存层,哈希表是一个存放链表的数组,通过散列函数来定位是哪个链表的头指针
在这里插入图片描述
案例实现–创建哈希表
在这里插入图片描述
在这里插入图片描述
特别注意在创建数组时,需要初始化每一个链表(创建了一个空的数组,数组里面没有任何的链表)!!!!实际在hashtable中,使用散列函数来定位是哪个链表后,基本所有的操作都是调用链表里的所有方法!!!!!

public class HashEmploye {
    public static void main(String[] args) {
        HashtaleEmp hashtable=new HashtaleEmp(5);
        Scanner scanner = new Scanner(System.in);
        String key="";
        while(true){
            System.out.println("e:退出");
            System.out.println("a:添加员工");
            System.out.println("l:查询hashtable");
            System.out.println("s:查询id的雇员");
            key=scanner.next();
            switch (key){
                case "a":
                    System.out.println("输入id");
                    int id=scanner.nextInt();
                    System.out.println("输入name");
                    String name=scanner.next();
                    Emp emp=new Emp(id,name);
                    hashtable.add(emp);
                    break;
                case "l":
                    hashtable.list();
                    break;
                case "s":
                    System.out.println("输入要查询的id号码:");
                    int id0=scanner.nextInt();
                    hashtable.findEmp(id0);
                    break;
                case "e":
                    scanner.close();
                    System.exit(0);
                    break;
                default:
                    break;
            }
        }



    }

}


//创建hashtable
class HashtaleEmp{
    private Emplinked[] emplinkedArr;
    private int size;//表示链表的条数

    public HashtaleEmp(int size) {
        this.size=size;
        emplinkedArr = new Emplinked[size];//创建了一个空的数组,数组里面没有任何的链表
        //这里需要初始化每一个链表
        for (int i = 0; i < size; i++) {
            emplinkedArr[i]=new Emplinked();
        }
    }

    //编写一个散列函数:根据员工的id来判断加入哪条链表(采用取模的方式)
    public int hashfun(int id){
        return id%size;
    }

    //添加雇员
    public void add(Emp emp){
        //相应的第hashfun(emp.id)条链表添加员工
        emplinkedArr[hashfun(emp.id)].add(emp);
    }

    //遍历hash表
    public  void list(){
        for (int i = 0; i < size; i++) {
            emplinkedArr[i].list(i);
        }
    }

    //查找雇员id是否存在该雇员
    public void findEmp(int id){
        int emplinkedNo=hashfun(id);//找出在第几条链表中查找
        if(emplinkedArr[emplinkedNo].findEmp(id)==null){
            System.out.println("没有查到该雇员");
        }else{
            System.out.println("id为:"+id+"的员工找到了");
        }
    }



}




//表示一个雇员类
class Emp{
    public int id;
    public String name;
    public Emp next;//默认为空

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


//表示一条员工的链表类
class Emplinked{
    private Emp head;//创建一个空的头指针


    //添加雇员到链表,要求id能够自增长
    public void add(Emp emp){
        //如果是添加的次链表的第一个员工信息
        if(head==null){
            head=emp;
            return;//注意直接添加完就返回
        }

        Emp cur=head;
        while (true){
            if(cur.next==null){//说明cur指向了链表的最后一个节点
                break;
            }
            cur=cur.next;
        }
        cur.next=emp;

    }


    //链表的遍历
    public  void list(int no){
        //no作为链表所在的数组位置索引
        if(head==null){
            System.out.println("第"+no+"条链表为空");
            return;
        }
        Emp cur=head;
        System.out.printf("第"+no+"条链表员工的信息为:\n");
        while (true){
            System.out.printf("id=%d,name=%s\t",cur.id,cur.name);
            if(cur.next==null){
                break;//说明已经到最后一个节点
            }
            cur=cur.next;
        }
        System.out.println();
    }


    //根据id查找一个雇员
    public Emp findEmp(int id){
        if(head==null){
            System.out.println("链表为空");
            return null;
        }
        Emp cur=head;
        while (true){
            if(cur.id==id){//就是当前的雇员
                break;
            }
            if(cur.next==null){//说明没有找到该雇员(肯定是cur指向了最后一个雇员,
                // 但是最后一个固原也不是要找的)
                cur=null;
                break;
            }

            cur=cur.next;
        }

        return cur;

    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值