Java手写哈希表

在这里插入图片描述

package com.zzuli.hash;

import java.util.Scanner;

/**
 * 哈希表的使用以及原理解释
 * @author liugang
 * @version 1.0
 * @date 2020/9/18 17:48
 */
public class HashTabDemo {

    public static void main(String[] args) {
         //显然这是创建一个hashTab对象
         HashTab hashTab  = new HashTab(7);
         //书写一个简单的菜单项
         String key = "";
         Scanner scanner = new Scanner(System.in);
         while (true){
             System.out.println("add:  添加雇员");
             System.out.println("list: 显示雇员");
             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.list();
                     break;
                 default:
                      break;
             }
         }
    }

}

//创建hashTab 管理多条链表
class HashTab{
    private EmpLinkList[] empLinkListArray; //显然这里是存放多条链表的数据
    private int size;      //表示多少条链表

    //构造器
    public HashTab(int size){
        this.size = size;
        //初始化empLinkListArray
        empLinkListArray = new  EmpLinkList[size];
        //分析后面这种写法的正确性与否 别忘了初始化数据的时候链表也应该初始化
        for (int i = 0; i < size; i++) {
            empLinkListArray[i] = new EmpLinkList();
        }
    }
    //添加雇员信息
    public void add(Emp emp){
        //根据员工id,判断出员工该是那条链表
        int empListedListNO = hashFun(emp.id);
        //将emp放入到对应的链表中去
        empLinkListArray[empListedListNO].add(emp);
    }

    //遍历所有的链表,遍历hashtab
    public void list(){
        for (int i = 0; i < size; i++) {
            empLinkListArray[i].list(i);
        }
    }

    //编写一个散列列表,使用一个简单的取模法
    public int hashFun(int id){
        return id % size;
    }
}


//表示一个雇员类
class Emp{
    public int id;
    public String name;
    public Emp next;//next 默认为null
    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

//创建一个EmplinkList,表示链表
class EmpLinkList{
    //头指针,执行第一个emp,因此我们的链表的第一个元素是指向emp的
    private Emp head; //默认是null

    //添加雇员到链表
    //1.假定,当添加雇员的时候,id自增长的,即id是从小到大的,因此我们直接将雇员信息添加到本链表的最后就行了
    public void add(Emp emp){
        //如果是第一个雇员,
        if (head==null){
            head = emp;
            return;
        }
        //如果不是第一个雇员,则需要一个辅助的指针,帮助定位到最后一位
        Emp curEmp = head;
        while (true){
            if (curEmp.next==null){
                break;
            }
            curEmp = curEmp.next;
        }
        //退出时直接将emp加入链表
        curEmp.next = emp;
    }

    //遍历链表的雇员信息
    public void list(int no){
        if (head==null){ //说明链表是空的
            System.out.println("第"+(no+1)+"链表为空");
            return;
        }
        System.out.print("当前第"+(no+1)+"的链表的信息是");
        Emp curEmp = head; //辅助指针
        while (true){
            System.out.printf(" => id=%d name=%s\t",curEmp.id,curEmp.name);
            if (curEmp.next==null){ //说明了curEmp是最后节点了
                break;
            }
            curEmp = curEmp.next;  //后移,遍历
        }
        System.out.println();
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值