2 个稳定版本
1.0.1 | 2024年5月12日 |
---|
#1228 在 数据结构
每月51次下载
8KB
76 行
aggregate-map
在 Rust 中轻松地将键值对列表收集到键到值集合的映射中。
lib.rs
:
将键值对列表收集到键到值集合的映射中。
如果您有一组数据想要收集到映射中,默认情况下您将只保留该键的数据中的最后一个值。但如果您想保留每个键的所有值集合呢?欢迎使用 AggregateMap
!
let data = [
("dog", "Terry"),
("dog", "Zamboni"),
("cat", "Jonathan"),
("dog", "Priscilla"),
];
let collected: AggregateMap<HashMap<_, Vec<_>>> = data.into_iter().collect();
let expected = HashMap::from([
("dog", vec!["Terry", "Zamboni", "Priscilla"]),
("cat", vec!["Jonathan"])
]);
assert_eq!(collected.into_inner(), expected);
AggregateMap
可以与任何实现了该包的 [Map
] 特质的映射类型一起使用,例如 HashMap
或 BTreeMap
。
集合类型不必是 [Vec
],它可以是实现 Extend
和 Default
的任何东西。例如,这里有一个使用 HashSet
的例子
let data = [
("dog", "Terry"),
("dog", "Terry"),
("dog", "Priscilla"),
];
let collected: AggregateMap<HashMap<_, HashSet<_>>> = data.into_iter().collect();
let expected = HashMap::from([
("dog", HashSet::from(["Terry", "Priscilla"])),
]);
assert_eq!(collected.into_inner(), expected);
甚至还可以是另一个 AggregateMap
,用于额外的聚合级别!
let data = [
("pet", ("dog", "Terry")),
("pet", ("dog", "Priscilla")),
("stray", ("cat", "Jennifer")),
("pet", ("cat", "Absalom")),
];
let collected: AggregateMap<HashMap<_, AggregateMap<HashMap<_, Vec<_>>>>> =
data.into_iter().collect();
let expected = HashMap::from([
("pet", HashMap::from([
("dog", vec!["Terry", "Priscilla"]),
("cat", vec!["Absalom"]),
])),
("stray", HashMap::from([
("cat", vec!["Jennifer"]),
])),
]);
let collected: HashMap<_, _> = collected
.into_inner()
.into_iter()
.map(|(key, map)| (key, map.into_inner()))
.collect();
assert_eq!(collected, expected);
依赖
~170KB