【哈希表】使用方法总结

1. uthash简介

开源的第三方头文件,这只是一个头文件:uthash.h。

uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。

2 uthash的使用

2.1 定义结构体

2.2 添加

2.3 查找

2.4 替换

2.5 删除

2.6 循环删除

2.7 删除哈希表所有元素

2.8 计算哈希表元素个数

2.9 遍历哈希表中的所有项目

2.10 排序哈希表


2.1 定义结构体

#include "uthash.h"
struct my_struct {
    int id;                    /* key */
    char name[10];
    UT_hash_handle hh;         /* makes this structure hashable */
};
/*声明哈希为NULL指针*/
struct my_struct *users = NULL;    /* important! initialize to NULL */
当结构体中的键值为字符串数组时
struct my_struct {
    char name[10];             /* key (string is WITHIN the structure) */
    int id;
    UT_hash_handle hh;         /* makes this structure hashable */
};
当结构体中的键值为字符串指针时
struct my_struct {
    const char *name;          /* key */
    int id;
    UT_hash_handle hh;         /* makes this structure hashable */
};

2.2 添加

  HASH_ADD_INT表示添加的键值为int类型

  HASH_ADD_STR表示添加的键值为字符串类型

  HASH_ADD_PTR表示添加的键值为指针类型

  HASH_ADD表示添加的键值可以是任意类型

void add_user(int user_id, char *name) {
    struct my_struct *s;
    /*重复性检查,当把两个相同key值的结构体添加到哈希表中时会报错*/
    HASH_FIND_INT(users, &user_id, s);  /* id already in the hash? */
    /*只有在哈希中不存在ID的情况下,我们才创建该项目并将其添加。否则,我们只修改已经存在的结构。*/
    if (s==NULL) {
      s = (struct my_struct *)malloc(sizeof *s);
      s->id = user_id;
      HASH_ADD_INT( users, id, s );  /* id: name of key field */
    }
    strcpy(s->name, name);
}

2.3 查找

struct my_struct *find_user(int user_id) {
    struct my_struct *s;
    s = (struct my_struct *)malloc(sizeof *s);
    HASH_FIND_INT( users, &user_id, s );  /* s: output pointer */
    return s;
}

2.4 替换

void replace_user(HashHead *head, HashNode *newNode) {
    HashNode *oldNode = find_user(*head, newNode->id);
    if (oldNode)
        HASH_REPLACE_INT(*head, id, newNode, oldNode);
}

2.5 删除

要从哈希表中删除结构,必须具有指向它的指针。(如果只有键,请先执行HASH_FIND以获取结构指针)。

void delete_user(struct my_struct *user) {
    HASH_DEL(users, user);  /* user: pointer to deletee */
    free(user);             /* optional; it's up to you! */
}

2.6 循环删除

HASH_ITER是一个宏定义,程序执行时被替换为一个循环

void delete_all() {
  struct my_struct *current_user, *tmp;

  HASH_ITER(hh, users, current_user, tmp) {
    HASH_DEL(users,current_user);  /* delete; users advances to next */
    free(current_user);            /* optional- if you want to free  */
  }
}

2.7 删除哈希表所有元素

如果您只想删除所有项目,但不释放它们或进行每个元素的清理,则可以通过一次操作更有效地做到这一点:

HASH_CLEAR(hh,users);

2.8 计算哈希表元素个数

unsigned int num_users;
num_users = HASH_COUNT(users);
printf("there are %u users\n", num_users);

2.9 遍历哈希表中的所有项目

void print_users() {
    struct my_struct *s;

    for(s=users; s != NULL; s=s->hh.next) {
        printf("user id %d: name %s\n", s->id, s->name);
    }
}

2.10 排序哈希表

HASH_SORT( users, name_sort );

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 使用 RedisTemplate 删除 Hash 表中的数据可以使用 delete(H key, Object... hashKeys) 方法。 示例: ``` redisTemplate.opsForHash().delete("myhash", "field1", "field2"); ``` 其中 "myhash" 是 Hash 表的名称,"field1" 和 "field2" 是要删除的字段。 也可以使用 `redisTemplate.opsForHash().entries(key).clear()` 清除一个 Hash 表所有的数据. 需要注意的是, 如果 Hash 表不存在, 此方法不会抛出错误. ### 回答2: 在Java中使用RedisTemplate删除哈希表可以通过以下步骤完成: 1. 首先,需要获取到RedisTemplate的实例,可以通过依赖注入或者new关键字创建。 ```java @Autowired private RedisTemplate<String, Object> redisTemplate; ``` 2. 接下来,使用RedisTemplate的opsForHash()方法获取到Hash操作的对象。 ```java HashOperations<String, Object, Object> hashOps = redisTemplate.opsForHash(); ``` 3. 最后,使用HashOperations的delete()方法来删除哈希表中的键值对。该方法接受两个参数,第一个参数是哈希表的键,第二个参数是要删除的键的集合。 ```java String hashKey = "myHash"; // 哈希表的键 List<Object> keys = new ArrayList<>(); keys.add("key1"); // 要删除的键1 keys.add("key2"); // 要删除的键2 hashOps.delete(hashKey, keys.toArray()); ``` 以上步骤中,我们首先获取到RedisTemplate的实例,然后使用其opsForHash()方法获取到Hash操作的对象,接着使用HashOperations的delete()方法删除指定的键值对。最后,我们需要指定哈希表的键和要删除的键集合,将要删除的键转换成数组传入delete()方法。这样就可以删除哈希表中的指定键值对了。 ### 回答3: Java中使用RedisTemplate删除hash表可以通过调用`opsForHash`方法获取Hash操作类对象,然后调用其提供的方法进行删除操作。 具体步骤如下: 1. 获取RedisTemplate对象。 2. 调用`opsForHash`方法获取Hash操作类对象。 3. 调用Hash操作类对象的`delete`方法进行删除操作。 示例代码如下: ```java // 获取RedisTemplate对象 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 设置相关配置 // 使用opsForHash方法获取Hash操作类对象 HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); // 调用delete方法删除Hash表 hashOperations.delete("hashKey", "field1", "field2"); ``` 上述代码中,我们先创建了一个RedisTemplate对象,并进行了相关配置。然后,通过调用RedisTemplate的`opsForHash`方法获取了Hash操作类对象`hashOperations`。接着,调用`hashOperations`的`delete`方法,传入hash表的key以及要删除的field参数,即可删除对应的field。 需要注意的是,`delete`方法可以一次删除多个field,即可传入多个field参数。如果要删除多个field,只需在`delete`方法的参数列表中添加相应的field即可。 以上就是使用RedisTemplate删除hash表的方法说明,通过调用Hash操作类对象的`delete`方法可以轻松地实现删除操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字神经元

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值