#key-value #collection #pair #collect #map #mapping #aggregate

aggregate-map

将键值对收集到键到值集合的映射中

2 个稳定版本

1.0.1 2024年5月12日

#1228数据结构

Download history 274/week @ 2024-05-09 29/week @ 2024-05-16 10/week @ 2024-05-23 3/week @ 2024-05-30 10/week @ 2024-06-06 37/week @ 2024-06-13 3/week @ 2024-06-20

每月51次下载

Unlicense

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] 特质的映射类型一起使用,例如 HashMapBTreeMap

集合类型不必是 [Vec],它可以是实现 ExtendDefault 的任何东西。例如,这里有一个使用 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