简单hashtab的实现

简单hashtab的实现

package com.atguigu.hashtable;

import java.util.Scanner;

/**
 * @author zhangtao
 * @date 2022/9/18 - 16:05
 */
public class HashtableDemo {
    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("delete:删除员工");
            System.out.println("update:更新员工");
            System.out.println("exit:退出");
            System.out.print("请输入您的选择:");
            key = scanner.next();
            switch (key) {
                case "add":
                    System.out.print("请输入id:");
                    int id = scanner.nextInt();
                    System.out.print("请输入名字:");
                    String name = scanner.next();
                    hashTab.add(new Emp(id, name));
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "find":
                    System.out.print("请输入你要查找的员工id:");
                    Emp empById = hashTab.findEmpById(scanner.nextInt());
                    System.out.println("empById = " + empById);
                    break;
                case "delete":
                    System.out.print("请输入你要删除的员工id:");
                    hashTab.delete(scanner.nextInt());
                    break;
                case "update":
                    System.out.print("请输入更新员工的id:");
                    id = scanner.nextInt();
                    Emp byId = hashTab.findEmpById(id);
                    if (byId == null) {
                        System.out.println("没有此id的员工");
                    } else {
                        System.out.print("请输入更新后员工的姓名:");
                        name = scanner.next();
                        hashTab.change(new Emp(id, name));
                    }
                    break;
                case "exit":
                    scanner.close();
                    System.exit(0);
                default:
                    System.out.println("输入的字符串不合法");
                    break;
            }
        }
    }
}

class HashTab {
    private EmpLinkedList[] empLinkedList;

    private int size;

    public HashTab(int size) {
        this.size = size;
        empLinkedList = new EmpLinkedList[size];
    }

    public void add(Emp emp) {
        int empNo = hashFun(emp.id);
        if (empLinkedList[empNo] == null) {
            empLinkedList[empNo] = new EmpLinkedList();
        }
        empLinkedList[empNo].add(emp);
    }

    public int hashFun(int id) {
        return id & (size - 1);
    }

    public void list() {
        for (int i = 0; i < size; i++) {
            if (empLinkedList[i] == null) {
                System.out.println("第 " + (i + 1) + " 条链表为空!");
                continue;
            }
            empLinkedList[i].list(i + 1);
        }
    }

    public Emp findEmpById(int id) {
        int hash = hashFun(id);
        if (empLinkedList[hash] == null) {
            return null;
        }
        return empLinkedList[hash].findById(id);
    }

    public void delete(int id) {
        int hash = hashFun(id);
        empLinkedList[hash].remove(id);
    }

    public void change(Emp emp) {
        int hash = hashFun(emp.id);
        empLinkedList[hash].update(emp);
    }
}


class EmpLinkedList {
    //头指针,执行第一个Emp,因此这个链表的head是指向第一个Emp
    private Emp head;

    public void update(Emp emp) {
        if (head == null) {
            System.out.println("此链表为空,不能修改");
            return;
        }
        Emp curEmp = head;
        while (true){
            if (curEmp.id == emp.id) {
                curEmp.name = emp.name;
                System.out.println("修改员工信息成功!");
                return;
            }
            curEmp = curEmp.next;
            if (curEmp == null) {
                System.out.println("此链表中没有此id的员工!");
                return;
            }
        }

    }

    public void add(Emp e) {
        if (head == null) {
            head = e;
            return;
        }
        Emp curEmp = head;

        while (curEmp.next != null) {
            curEmp = curEmp.next;
        }
        curEmp.next = e;

    }

    public void list(int i) {
        if (head == null) {
            System.out.println("第 " + i + " 条链表为空!");
            return;
        }
        System.out.print("第 " + i + " 条链表的信息为:");
        Emp curEmp = head;
        while (true) {
            System.out.print(curEmp + "\t=>\t");
            curEmp = curEmp.next;
            if (curEmp == null) {
                break;
            }
        }
        System.out.println();
    }

    public Emp findById(int id) {
        if (head == null) {
            return null;
        }
        Emp curEmp = head;
        while (true) {
            if (curEmp.id == id) {
                break;
            }
            curEmp = curEmp.next;
            if (curEmp == null) {
                break;
            }
        }
        return curEmp;

    }

    public void remove(int id) {
        if (head == null) {
            System.out.println("链表为空,无法删除!");
            return;
        }
        Emp curEmp = head;
        while (true) {
            if (head.id == id) {
                head = null;
                System.out.println("删除员工成功");
                return;
            }

            if (curEmp.next == null) {
                System.out.println("没有此员工,无法删除");
                return;
            }

            if (curEmp.next.id == id) {
                curEmp.next = curEmp.next.next;
                System.out.println("删除员工成功");
                return;
            }

            curEmp = curEmp.next;

        }
    }
}

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 + '\'' +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值