我有一个HashMap<u32, Sender>
。 Sender
是一个开放的连接对象,键是一个用户ID。每个用户可以从多个设备连接。我需要为同一用户ID存储所有可能的打开连接。之后,我可以迭代并向同一用户的所有打开的连接发送消息。
以上HashMap
仅将每个用户ID和连接存储一次。我需要获得一个具有多个值的键。如何将值放入列表或数组中,以便查看存在的连接并将其发送给所有连接?
我不是在谈论诸如枚举之类的不同值类型。我说的是相同的类型值,但不止一个。也许HashMap
不是为此设计的吗?
也欢迎其他想法。
答案 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)
将检索所有这些值。