数据结构--哈希表(Java)

博客阐明

文章所波及的材料来自互联网整顿和集体总结,意在于集体学习和教训汇总,如有什么中央侵权,请分割自己删除,谢谢!

介绍

哈希表底层是数组加链表或者是数组加二叉树,一个数组外面有多个链表,通过散列函数来提高效率

代码

package cn.guizimo.hashtab;import java.util.Scanner;/** * @author guizimo * @date 2020/7/23 10:29 下午 */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("list:显示");            System.out.println("find:显示");            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;                case "find":                    System.out.println("请输出id");                    id = scanner.nextInt();                    hashTab.find(id);                    break;                case "exit":                    scanner.close();                    System.exit(0);                default:                    break;            }        }    }}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 HashTab{    private EmpLinkedList[] empLinkedListArray;    private int size;    //结构器    public HashTab(int size){        this.size = size;        empLinkedListArray = new EmpLinkedList[size];        for (int i = 0; i < size; i++) {            empLinkedListArray[i] = new EmpLinkedList();        }    }    //增加    public void add(Emp emp){        int empLinkedListNo = hashFun(emp.id);        empLinkedListArray[empLinkedListNo].add(emp);    }    public void find(int id){        int empLinkedListNo = hashFun(id);        Emp emp = empLinkedListArray[empLinkedListNo].find(id);        if (emp != null){            System.out.printf("在第%d条链表中找到id=%d\n",(empLinkedListNo+1),id);        }else {            System.out.println("没有找到");        }    }    //遍历    public void list(){        for (int i = 0; i < size; i++) {            empLinkedListArray[i].list(i);        }    }    //散列(取模)    public int hashFun(int id){        return id % size;    }}class EmpLinkedList{    private Emp head;    public void add(Emp emp){        if(head == null){            head = emp;            return;        }        Emp curEmp = head;        while (true){            if(curEmp.next == null){                break;            }            curEmp = curEmp.next;        }        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){                break;            }            curemp = curemp.next;        }        System.out.println();    }    public Emp find(int id){        if(head == null){            System.out.println("链表为空");            return null;        }        Emp curEmp = head;        while (true){            if(curEmp.id == id){                break;            }            if(curEmp.next == null){                curEmp = null;                break;            }            curEmp = curEmp.next;        }        return curEmp;    }}

感激

尚硅谷

万能的网络

以及勤奋的本人