如何在 Rust HashMap 中为同一个键存储多个元素?
How can I store multiple elements in a Rust HashMap for the same key?
我有一个HashMap<u32, Sender>
。 Sender
是一个打开的连接对象,key 是一个用户id。每个用户可以从多个设备连接。我需要为同一用户 ID 存储所有可能的打开连接。在此之后,我可以迭代并将消息发送到同一用户的所有打开的连接。
以上HashMap
只存储每个用户id和连接一次。我需要获得一个具有多个值的键。我怎样才能把这个值变成一个列表或数组,这样我就可以看到存在哪些连接并将它们全部发送给它们?
我不是在谈论不同的值类型,比如枚举。我说的是相同的类型值,但不止一个。也许 HashMap
不是为此设计的?
也欢迎其他想法。
要使用 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_default()
// 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)
将检索所有这些值。
我有一个HashMap<u32, Sender>
。 Sender
是一个打开的连接对象,key 是一个用户id。每个用户可以从多个设备连接。我需要为同一用户 ID 存储所有可能的打开连接。在此之后,我可以迭代并将消息发送到同一用户的所有打开的连接。
以上HashMap
只存储每个用户id和连接一次。我需要获得一个具有多个值的键。我怎样才能把这个值变成一个列表或数组,这样我就可以看到存在哪些连接并将它们全部发送给它们?
我不是在谈论不同的值类型,比如枚举。我说的是相同的类型值,但不止一个。也许 HashMap
不是为此设计的?
也欢迎其他想法。
要使用 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_default()
// 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)
将检索所有这些值。