手写哈希表

情景: google公司上机题, 有一个公司,当有新员工来报到时,要求将该员工的信息加入(ID,姓名,年龄,地址),当输入员工的ID时,要求查找到该员工的所有信息
要求: 不使用数据库,速度越快越好====》言外之意,用hash表来完成

package com.datastructure.HashTableDemo;

import java.util.Scanner;

/**
 * google公司上机题
 *
 * 有一个公司,当有新员工来报到时,要求将该员工的信息加入(ID,姓名,年龄,地址),当输入员工的ID时,要求查找到该员工的所有信息
 *
 * 要求:不使用数据库,速度越快越好====》言外之意,用hash表来完成
 */
public class HashTab {

    //测试一把
    public static void main(String[] args) {

        HashT hashT = new HashT(5);

        boolean flag = true;
        while (flag){
            System.out.println("add.添加元素");
            System.out.println("del.删除元素");
            System.out.println("find.查找元素");
            System.out.println("list.展示元素");
            System.out.println("exit.退出");
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入您的选择:");
            String key = scanner.next();
            int id;
            int age;
            String name;
            switch (key){
                case "add":
                    System.out.println("请输入ID:");
                    id = scanner.nextInt();
                    System.out.println("请输入年龄:");
                    age = scanner.nextInt();
                    System.out.println("请输入姓名:");
                    name = scanner.next();
                    Emp emp = new Emp(id,age,name);
                    hashT.add(emp);
                    break;

                case "del":
                    System.out.println("请输入ID:");
                    id = scanner.nextInt();
                    hashT.del(id);
                    break;

                case "find":
                    System.out.println("请输入ID:");
                    id = scanner.nextInt();
                    hashT.find(id);
                    break;

                case "list":
                    hashT.show();
                    break;

                case "exit":
                    scanner.close();
                    flag = false;
                    break;

                default:
                    break;
            }
        }
        System.out.println("退出成功");
    }
}

//建立哈希表
class HashT{
    private CreateLinkedList[] arr;
    private int size;

    protected HashT(int size){
        this.size = size;
        arr = new CreateLinkedList[size];

        //将哈希表中的每一个链表初始化
        for (int i = 0; i <size ; i++) {
            arr[i] = new CreateLinkedList();
        }
    }

    //散列函数,用于确定数据放在哪一个链表里
    public int Hash(int id){
        return id%size;
    }

    //添加
    public void add(Emp emp){
        int position = Hash(emp.getId());
        arr[position].add(emp);
    }

    //删除
    public void del(int id){
        int position = Hash(id);
        arr[position].del(id);
    }

    //展示
    public void show(){
        for (int i = 0; i <size ; i++) {
            arr[i].show(i);
        }
    }

    //查找
    public void find(int id){
        int position = Hash(id);
        System.out.println(arr[position].search(id));
    }


}

//建立链表
class CreateLinkedList{

    //指定链表的头,默认为空
    private Emp head;

    //添加,添加到链表的尾部
    public void add(Emp emp){
        //如果是第一个元素
        if (head==null){
            head = emp;
        }else {
            //建立一个辅助指针
            Emp temp = head;
            while (temp.getNext()!=null){
                temp = temp.getNext();
            }
            //已经找到链表的尾部,添加元素
            temp.setNext(emp);
        }
    }



    //删除
    public void del(int id){

        if (head.getNext()==null&&head.getId()==id){
            head = null;
        }else if (head.getNext()!=null&&head.getId()==id){
            head = head.getNext();
        } else {
            //建立一个辅助指针
            Emp temp = head;

            while (temp.getNext()!=null && temp.getNext().getId()!=id){
                temp = temp.getNext();
            }
            if (temp.getNext()!=null){
                //已经找到要删除元素的前一个元素
                temp.setNext(temp.getNext().getNext());
            }else {
                System.out.println("哈希表中没有此元素");
            }
        }
    }

    //查找
    public Emp search(int id){
        //建立一个辅助指针
        Emp temp = head;

        while (temp!=null && temp.getId()!=id){
            temp = temp.getNext();
        }
        if (temp==null){
            return null;
        }else {
            return temp;
        }
    }

    //展示
    public void show(int num){
        if (head==null){
            System.out.println("第"+(num+1)+"条链表没有数据");
            return;
        }
        System.out.printf("第"+(num+1)+"条链表输出数据为");
        //建立一个辅助指针
        Emp temp = head;
        while (temp!=null){
            System.out.printf("==>id=%d,age=%d,name=%s\t",temp.getId(),temp.getAge(),temp.getName());
            temp = temp.getNext();
        }
        System.out.println();
    }
}



//建立员工节点
class Emp{
    private int id;
    private int age;
    private String name;
    private Emp next;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Emp getNext() {
        return next;
    }

    public void setNext(Emp next) {
        this.next = next;
    }

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值