使用哈希表存储用户数据

一、思路分析

二、代码部分

2.1 员工类

//雇员类
class Employee {
    public int id;
    public String name;
    public Employee next;

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

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

2.2 链表的操作类

class EmpLinkedList{
    private Employee head;//此链表是不带头节点
}

2.3 操作类中的增删改查方法

2.3.1 添加

第一种:不按顺序添加,默认添加顺序为链表的末尾

 public void add(Emp emp) {
        if (head == null) {
            head = emp;
            return;
        }
        Emp curHead = head;//定义一个辅助指针
        while (true) {
            if (curHead.next == null) {
                break;
            }
            curHead = curHead.next;//后移指针
        }
        //当while循环结束时,代表指针指在链表末尾
        curHead.next = emp;
    }

第二种 按顺序添加 ,此代码根据id大小进行添加

 public void add(Employee emp) {
        if(head==null){
            head=emp;
            return;
        }
     Employee curHead=head;
     while (true){
         if (head.next==null){
             if (head.id> emp.id){
                 head=emp;
                 emp.next=curHead;
                 break;
             }else{
                 head.next=emp;
                 break;
             }
         }else {
             if (curHead.next.next==null){
                 if (curHead.next.id<emp.id){
                     curHead.next.next=emp;
                    break;
                 }else {
                     if (curHead.id>emp.id){
                        head=emp;
                        emp.next=curHead;
                        break;
                     }
                     emp.next=curHead.next;
                     curHead.next=emp;
                     break;
                 }
             }
         }
         curHead=curHead.next;
     }
    }

由于本人技术不够精湛,若写的代码不够完美,希望各路大神可以帮做指导

2.3.2 根据指定id查找信息

 public Emp findEmp(int id) {
        if (head == null) {
            System.out.println("请先向链表添加数据");
        }
        Emp curHead = head;
        while (true) {
            if (curHead.id == id) {
                return curHead;
            }
            if (curHead.next == null) {
                curHead = null;
                break;
            }
            curHead = curHead.next;
        }
        throw new RuntimeException("找不到该员工的信息");
    }

2.3.3 根据指定id删除员工信息

public void delete(int id) {
        if (head == null) {
            System.out.println("链表为空,不能删除");
            return;
        }
        if (head.id == id) {
            head = head.next;
            return;
        }
        Emp curHead = head;
        while (head.next != null) {
            if (head.next.id == id) {
                head.next = head.next.next;
                break;
            }
            curHead = curHead.next;
        }
    }

2.3.4 查看所有员工信息

   public void list(int i) {
        if (head == null) {
            System.out.println("第" + (i + 1) + "条链表为空");
            return;
        }
        System.out.print("第" + (i + 1) + " 链表的信息为");
        Emp curHead = head;//定义一个辅助指针
        while (true) {
            System.out.print("=》id=" + curHead.id + " name=" + curHead.name);
            if (curHead.next == null) {
                break;
            }
            curHead = curHead.next;
        }
        System.out.println(


        );
    }

3.哈希表:本人的思路是将他看作成一个数组,实际上操作链表的增删改查是通过该类进行操作

//管理多个链表的类,实际操作链表即哈希表
class HashTable {
    private EmpLinkedList[] empLinkedListArr;
    private int size;

    public HashTable(int size) {
        this.size = size;
        empLinkedListArr = new EmpLinkedList[size];
        //注意点 目前empLinkedListArr这个数组存放都是null值,因为没有对里面的链表进行实例化
        //所以要实例化
        for (int i = 0; i < empLinkedListArr.length; i++) {
            empLinkedListArr[i] = new EmpLinkedList();
        }
    }

    public void add(Emp emp) {
        //先得到当前员工对应的散列函数值
        int functionValue = hashFunction(emp.id);
        empLinkedListArr[functionValue].add(emp);
    }

    public void list() {
        for (int i = 0; i < empLinkedListArr.length; i++) {
            empLinkedListArr[i].list(i);
        }
    }

    public void findEmp(int id) {
        int functionValue = hashFunction(id);
        Emp emp = empLinkedListArr[functionValue].findEmp(id);
        System.out.println(emp);
    }

    public void delete(int id) {
        int functionValue = hashFunction(id);
        empLinkedListArr[functionValue].delete(id);
    }

    //散列函数,通过散列函数计算出要将此id值的员工存放在哪一个链表上 即:计算结果为3 就代表放在第三条链表上
    //最简单的散列函数计算方法 取模运算
    public int hashFunction(int id) {
        return id % size;
    }
}

4.主界面代码

public static void main(String[] args) {
        HashTable hashTable = new HashTable(7);
        System.out.println("欢迎来到雇员系统:");
        String key;
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("add: 添加雇员");
            System.out.println("list: 查看雇员");
            System.out.println("findEmp: 查找雇员");
            System.out.println("delete: 删除雇员");
            System.out.println("exit: 退出系统");
            System.out.print("请输入你的选择:");
            key = scanner.next();
            switch (key) {
                case "add":
                    System.out.println("输入要添加的员工号:");
                    int id = scanner.nextInt();
                    System.out.println("输入要添加的员工姓名:");
                    String name = scanner.next();
                    hashTable.add(new Emp(id, name));
                    break;
                case "list":
                    System.out.println("所有信息为:");
                    hashTable.list();
                    break;
                case "exit":
                    scanner.close();
                    System.exit(0);
                    break;
                case "delete":
                    System.out.println("输入要删除的员工号:");
                    id = scanner.nextInt();
                    hashTable.delete(id);
                    break;
                case "findEmp":
                    System.out.println("输入要查找的员工号:");
                    id = scanner.nextInt();
                    hashTable.findEmp(id);
                    break;
                default:
                    break;
            }
        }
    }

三、总结部分

哈希表是一种重要的存储方式,博主也是刚入门不久,技术不是很精湛,刚刚接触到哈希表时也比较懵圈,通过画了几次思路图才慢慢明白了其原理;代码写的也比较繁琐,希望有大神可以帮忙指导更改!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值