Hash表简单实现

文章介绍了哈希表的概念,作为一种通过键值对快速查找数据的结构,它是数组的扩展,使用了数据的下标随机访问特性。文中提供了一个简单的Java实现,使用链表数组存储课程对象,并展示了添加、查找和遍历哈希表的功能。
摘要由CSDN通过智能技术生成

哈希表

  • 哈希表又称为散列表,它是一种以键值对形式来存储数据的结构,只要输入待查找的key,就可以通过该key寻找到对应的值。对应函数:y = f(key)
  • 通过把关键码映射到表中的对应位置来访问对应信息,来加快查找速度
  • 哈希表用的是数据支持下标随机、访问数据的特性来实现的,所以说哈希表是数组的扩展,是由数组演化而成。
  • 数据储存 可以通过 数组+链表 的方式来实现
/**
 * @author Lu.F
 * @version 1.0
 * @date 2023/1/30 17:51
 */
public class HashTableDemo {

    public static void main(String[] args) {
        // 创建hash表
        HashTable hashTable = new HashTable(5);
        Course course1 = new Course(1, "课程1");
        Course course2 = new Course(2, "课程2");
        Course course3 = new Course(3, "课程3");
        Course course4 = new Course(4, "课程4");
        Course course5 = new Course(5, "课程5");
        Course course6 = new Course(6, "课程6");
        hashTable.add(course1);
        hashTable.add(course2);
        hashTable.add(course3);
        hashTable.add(course4);
        hashTable.add(course5);
        hashTable.add(course6);
        hashTable.show();
        // 根据id查找
        System.out.println(hashTable.findById(7));

    }
}

class HashTable {

    // 链表数组
    CourseLinked[] node;

    // 指定数组大小
    int maxSize;

    // 初始化
    public HashTable(int maxSize) {
        // 初始化数组大小
        this.maxSize = maxSize;
        node = new CourseLinked[maxSize];
        // 遍历链表数组进行初始化
        for (int i = 0; i < maxSize; i++) {
            node[i] = new CourseLinked();
        }
    }

    // 添加链表元素
    public void add(Course course) {

        // 如何添加,通过id,取余得出位置
        int id = course.id % maxSize;
        // 添加
        node[id].addCourse(course);

    }

    // 遍历hash表
    public void show() {
        for (int i = 0; i < maxSize; i++) {
            System.out.printf("index:%d\n", i);
            node[i].show();
        }
    }

    // 根据id查找链表
    public Course findById(int id) {
        // 取余
        int index = id % maxSize;
        Course course = node[index].findCourseById(id);
        // 如果course不为null
        return course;
    }

}

class CourseLinked {

    // 头结点 head
    private Course head;

    // 添加节点
    public void addCourse(Course course) {
        // 如果头结点为null
        if (head == null) {
            // 给头结点赋值
            head = course;
            // 结束
            return;
        }
        // 如果头结点不为空
        Course cur = head;
        while (cur.next != null) {
            // 查找尾结点
            cur = cur.next;
        }
        cur.next = course;
    }

    // 遍历链表
    public void show() {
        // 如果头结点不为空
        Course cur = head;

        // 遍历节点
        while (cur != null) {
            System.out.printf("id:%d ======= name:%s \n", cur.id, cur.courseName);
            cur = cur.next;
        }
    }

    // 根据id查找课程
    public Course findCourseById(int id) {
        // 遍历链表进行查找
        if (head != null) {
            Course cur = head;
            while (cur != null) {
                if (cur.id == id) {
                    return cur;
                }
                cur = cur.next;
            }
        }

        return null;
    }

}

class Course {

    int id;

    String courseName;

    Course next;

    public Course(int id, String courseName) {
        this.id = id;
        this.courseName = courseName;
    }

    @Override
    public String toString() {
        return "Course{" +
                "id=" + id +
                ", courseName='" + courseName + '\'' +
                ", next=" + next +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值