如何在Rust HashMap中为同一个键存储多个元素?

Pra*_*tha 3 hashmap multimap rust data-structures

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

以上HashMap仅存储每个用户ID和连接一次.我需要获得一个具有多个值的键.如何将值转换为列表或数组,以便我可以看到哪些连接存在并发送给它们?

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

其他想法也受到欢迎.

Pet*_*all 6

HashMap使用a 来执行此操作,您应该使用a Vec作为值,以便每个键可以指向多个Senders.那种类型就是HashMap<u32, Vec<Sender>>.

使用这种结构,insert()当您需要改变这样的值时,只需使用就可以变得笨拙,但您可以使用EntryAPI一次性检索和更新记录.例如:

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); 
Run Code Online (Sandbox Code Playgroud)

您也可以使用multimapcrate,它在引擎盖下做类似的事情,但增加了一层抽象.您可能会发现使用起来更容易:

let mut multi_map = MultiMap::new();

multi_map.insert(3, sender_1);
multi_map.insert(3, sender_2);
Run Code Online (Sandbox Code Playgroud)

该方法multi_map.get(key)将使用该键的第一个值,同时multi_map.get_vec(key)将检索所有这些值.