哈希表总纲

哈希表的介绍和内存布局
在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;

public class HashTabTest {
    
    
    public static void main(String[] args) {
    
    
        //创建哈希表
        HashTab hashTab = new HashTab(10);
        //编写运行时提示窗口
        String key = "";
        Scanner scanner = new Scanner(System.in);
        while(true){
    
    
            System.out.println("输入add: 添加职员");
            System.out.println("输入list: 打印所有链表中的职员信息");
            System.out.println("输入find: 根据id查找职员");
            System.out.println("输入delete: 根据id删除职员");
            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 "exit":
                    System.out.println("程序退出");
                    scanner.close();
                    System.exit(0);
                case "find":
                    System.out.println("请输入一个id");
                    int empid = scanner.nextInt();
                    hashTab.findEmpById(empid);
                    break;
                case "delete":
                    System.out.println("请输入一个id");
                    int empid1 = scanner.nextInt();
                    hashTab.deleteEmpById(empid1);
                    break;
                default:
                    System.out.println("请输入正确的操作代码");
                    break;
            }
        }
    }
}

//节点类
class Emp{
    
      //职员
    public int id;
    public String name;
    public Emp next;

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

    @Override
    public String toString() {
    
    
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

//链表类
class LinkedList{
    
    
    private Emp head;

    //添加方法, 假设每次新添加的节点都是自增的, 所以都是添加在最后
    public void add(Emp emp){
    
    
        if (head == null){
    
     //如果该链表为空直接添加
            head = emp;
            return;
        }
        //辅助指针
        Emp cur = head;
        while(true){
    
    
            if (cur.next == null){
    
    
                break;
            }
            cur = cur.next;
        }
        //出这个while之后cur就是最后一个节点
        cur.next = emp;
    }

    //遍历的方法
    public void list(int i){
    
    
        if (head == null){
    
    
            System.out.println("第"+(i+1)+"条链表为空!");
            return;
        }
        System.out.print("第"+(i+1)+"条链表信息为");
        Emp cur = head;
        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 findEmpById(int id){
    
    
        if (head == null){
    
    
            return null;
        }
        Emp cur = head;
        while(true){
    
    
            if (cur.id == id){
    
    
                return cur;
            }
            if (cur.next == null){
    
    
                break;
            }
            cur = cur.next;
        }
        return null;
    }

    //删除某个id的职员信息
    public void deleteEmp(int id){
    
    
        if (head == null){
    
    
            System.out.println("没有这个职员");
            return;
        }
        if (head.id == id){
    
    
            head = head.next;
            System.out.println("删除完成");
            return;
        }
        Emp cur = head;
        while(cur.next != null){
    
    
            if (cur.next.id == id){
    
    
                cur.next = cur.next.next;
                System.out.println("删除完成");
                return;
            }
            cur = cur.next;
        }
        System.out.println("没有这个职员");
        return;
    }
}

//创建Hashtab的对象
class HashTab{
    
    
    private LinkedList[] empHashTab;
    int size;

    //初始化
    public HashTab(int size) {
    
    
        this.size = size;
        empHashTab = new LinkedList[size];
        for (int i=0; i < size; i++){
    
    
            empHashTab[i] = new LinkedList();
        }
    }

    //编写散列函数: 根据emp的id确定往哪条链表添加
    public int sanlie(int id){
    
    
        return id % size;
    }

    //添加方法
    public void add(Emp emp){
    
    
        //得到下标
        int linkedlistno = sanlie(emp.id);
        empHashTab[linkedlistno].add(emp);
    }

    //遍历整个哈希表
    public void list(){
    
    
        for (int i=0; i<size; i++){
    
    
            empHashTab[i].list(i);
        }
    }

    //查找某个id的职员信息
    public void findEmpById(int id){
    
    
        int linkedlistno = sanlie(id);
        Emp empById = empHashTab[linkedlistno].findEmpById(id);
        if (empById == null){
    
    
            System.out.println("没有id为"+id+"的职员");
            return;
        }else{
    
    
            System.out.println("id为"+id+"的职员信息为"+empById);
        }
    }

    //删除
    public void deleteEmpById(int id){
    
    
        int linkedlistno = sanlie(id);
        empHashTab[linkedlistno].deleteEmp(id);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45032905/article/details/121287173