07哈希表

哈希表(hash table)

又称为散列表,通过关键码值,直接访问数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CqA1MkfZ-1627263761982)(C:\Users\松鼠打不赢仓鼠\AppData\Roaming\Typora\typora-user-images\image-20210721154939780.png)]

数组 + 链表实现哈希表:

package msp.cai.hashtable;

/*
 * 数组 + 链表 实现哈希表 --> 存储用户信息
 */
public class HashTableDemo {
    public static void main(String[] args) {
        UserHashTable userHash = new UserHashTable(5);
        userHash.addUser(new User(1,"Tom", 18));
        userHash.addUser(new User(2,"Jack", 20));
        userHash.addUser(new User(3,"Bob", 21));
        userHash.addUser(new User(100,"Adam", 36));
        userHash.addUser(new User(200,"York", 60));
        userHash.addUser(new User(4,"Zero", 25));
        userHash.print();
        userHash.searchUser(200);
        userHash.deleteUser(200);
        userHash.print();
    }
}

// 用户类
class User {
    int id;
    String name;
    int age;
    User next;

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

// 用户链表类
class UserLinkedList {
    private User head;   // 头节点

    // 新增节点
    public void add(User user) {
        // 第一次添加
        if (head == null) {
            head = user;
            return;
        }
        // 辅助节点,遍历
        User temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = user;
    }

    // 打印链表
    public void print() {
        User temp = head;
        if (temp == null) {
            return;
        }
        System.out.print("==>链表: ");
        while (true) {
            if (temp.next == null) {
                System.out.printf("id:%d, name:%s, age:%d", temp.id, temp.name, temp.age);
                break;
            }
            System.out.printf("id:%d, name:%s, age:%d-->", temp.id, temp.name, temp.age);
            temp = temp.next;
        }
        System.out.println();
    }

    // 查询节点
    public User search(int id) {
        User temp = head;
        if (temp == null) {
            return null;
        }
        while (true) {
            if (temp.id == id) {
                System.out.printf("找到了,在x中:id=%d,name=%s,age=%d", temp.id, temp.name, temp.age);
                System.out.println();
                return temp;
            }
            if (temp.next == null) return null;
            temp = temp.next;
        }
    }

    // 删除节点
    public void delete(int id) {
        User temp = head;
        if (temp == null) {
            System.out.println("链表为空~");
            return;
        }
        // 若待删除的节点在开头
        if (temp.id == id)  head = temp.next;
        // 若待删除的节点在中间
        while (true) {
            if (temp.next == null) break;
            if (temp.next.id == id) { // 找到该节点的上一个节点
                temp.next = temp.next.next; // 完成删除
                return;
            }
            temp = temp.next;
        }
    }
}

// 用户哈希表
class UserHashTable {
    int maxSize;
    UserLinkedList[] array;

    public UserHashTable(int maxSize) {
        this.maxSize = maxSize;
        this.array = new UserLinkedList[maxSize];

        for (int i = 0; i < maxSize; i++) {
            array[i] = new UserLinkedList();
        }
    }

    // 散列函数
    public int getId(int id) {
        return id % maxSize;
    }

    // 添加用户, 添加到末尾
    public void addUser(User user) {
        int link_id = getId(user.id);   // 定位在哪条链表
        // 判断当前链表中是否已有
        User search = array[link_id].search(user.id);
        if (search==null)  { // 可以添加
            array[link_id].add(user);
        } else    // 已经存在了
            System.out.println("抱歉, 该用户已存在~");
    }

    // 删除用户
    public void deleteUser(int id) {
        int link_id = getId(id);   // 定位在哪条链表
        array[link_id].delete(id);
    }

    // 查询用户
    public void searchUser(int id) {
        int link_id = getId(id);   // 定位在哪条链表
        array[link_id].search(id);
    }

    // 打印哈希表
    public void print() {
        for (UserLinkedList linkedList : array) {
            linkedList.print();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值