如何在同一个密钥的Rust HashMap中存储多个元素?

时间:2018-07-29 21:31:41

标签: data-structures hashmap rust multimap

我有一个HashMap<u32, Sender>Sender是一个开放的连接对象,键是一个用户ID。每个用户可以从多个设备连接。我需要为同一用户ID存储所有可能的打开连接。之后,我可以迭代并向同一用户的所有打开的连接发送消息。

以上HashMap仅将每个用户ID和连接存储一次。我需要获得一个具有多个值的键。如何将值放入列表或数组中,以便查看存在的连接并将其发送给所有连接?

我不是在谈论诸如枚举之类的不同值类型。我说的是相同的类型值,但不止一个。也许HashMap不是为此设计的吗?

也欢迎其他想法。

1 个答案:

答案 0 :(得分:6)

要对HashMap执行此操作,应使用Vec作为值,以便每个键可以指向多个Sender。这样的类型就是HashMap<u32, Vec<Sender>>

使用这种结构,仅在需要更改这样的值时仅使用insert()会比较笨拙,但是可以使用Entry API一次性获取和更新记录。例如:

let mut hash_map: HashMap<u32, Vec<Sender>> = HashMap::new();

hash_map.entry(3)
    // If there's no entry for key 3, create a new Vec and return a mutable ref to it
    .or_insert_with(Vec::new)
    // and insert the item onto the Vec
    .push(sender); 

您还可以使用multimap crate,它在幕后做了类似的事情,但是增加了一层抽象。您可能会发现使用它更容易:

let mut multi_map = MultiMap::new();

multi_map.insert(3, sender_1);
multi_map.insert(3, sender_2);

方法multi_map.get(key)将使用该键作为第一个值,而multi_map.get_vec(key)将检索所有这些值。