#multiple-values #multiset #multimap #container #key #collection #per

multi_containers

每个键可以优雅地处理多个值

6 个版本

0.2.1 2024年2月27日
0.2.0 2024年2月27日
0.1.3 2024年2月22日

#1053 in 数据结构

MIT 许可证

68KB
1.5K SLoC

multi_containers

crates.io docs

该软件包实现了可以包含重复值的容器。如果您曾经编写过 HashMap<K, HashSet<V>>,那么这个软件包就是为您准备的。

该软件包不稳定,其API可能在1.0.0之前随时更改.

该软件包的精神与以下其他语言中的容器相似

  • Java的 Guava 库的 MultimapMultiset(这个软件包受到了很大的启发)。
  • Python的 collections.defaultdict(set)collections.Counter
  • C++的 std::(unordered_)mutlimapstd::(unordered_)multiset

用法

主要容器是 MultiMapMultiSet。有关更多示例,请参阅 examples.rs

MultiMap

MultiMap 是对 Map<K, Set<V>> 的包装。您可以使用提供的 HashMultiMapBTreeMultiMap,或者使用 MultiMapBuilder 提供自己的类型。API 与您期望的 HashMap<K, HashSet<V>> 类似,但增加了一些与多个值相关的方法。出于记录原因,内部集合不可可变地暴露。MultiMap 还提供了遍历 (&K, &Set<V>)(&K, &V) 的方法。

use multi_containers::HashMultiMap;
let mut map = HashMultiMap::new();
map.insert("a".to_string(), 1);
map.insert("a".to_string(), 2);
map.insert("b".to_string(), 3);
assert_eq!(map.get("a").unwrap().len(), 2);
assert_eq!(map.get("b").unwrap().len(), 1);

MultiSet

MultiSet 是对 Map<V, usize> 的包装。它提供集合的语义,但允许重复值。它提供遍历唯一 (&V, usize) 和非唯一 &V 的迭代器。

use multi_containers::HashMultiSet;
let mut set = HashMultiSet::new();
set.insert(1);
set.insert(1);
set.insert_some(2, 3);
assert_eq!(set.count(&1), 2);
assert_eq!(set.count(&2), 3);

许可证:MIT

无运行时依赖