#key-value #collection #iterator #group #mapping #grouping #trivial

iter-group

用于将(键,值)迭代器分组到集合映射的库

3个版本 (破坏性)

0.3.0 2024年8月8日
0.2.0 2023年3月24日
0.1.0 2022年9月1日

#453 in 算法

Download history 1/week @ 2024-04-22 8/week @ 2024-05-06 8/week @ 2024-05-20 1/week @ 2024-06-03 2/week @ 2024-06-10 1/week @ 2024-06-17 1/week @ 2024-07-29 105/week @ 2024-08-05

每月106次下载
用于 emuman

MIT/Apache

14KB
189

iter-group

一个简单的库,用于扩展(key, value)迭代器,以返回一个映射类型,其键是按某种类型value分组的集合。

本质上,它替换了以下内容

let a = [(1, 'a'), (2, 'b'), (3, 'c'), (2, 'd'), (1, 'e'), (1, 'f')];
let mut map: HashMap<_, Vec<_>> = HashMap::default();
for (k, v) in a.into_iter() {
    map.entry(k).or_default().push(v);
}

为以下内容

use iter_group:::IntoGroup;
let a = [(1, 'a'), (2, 'b'), (3, 'c'), (2, 'd'), (1, 'e'), (1, 'f')];
let map = a.into_iter().group::<HashMap<_, Vec<_>>>();

请参阅文档以获取更多示例。


lib.rs:

扩展迭代器,将它们的值分组到一个映射类型中,其中值是集合。

示例1

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoGroup;

let v = vec![(1, 'a'), (2, 'b'), (3, 'c'), (2, 'd'), (1, 'e'), (1, 'f')];

let h = v.iter().cloned().group::<HashMap<_, Vec<_>>>();
assert_eq!(h.get(&1), Some(&vec!['a', 'e', 'f']));
assert_eq!(h.get(&2), Some(&vec!['b', 'd']));
assert_eq!(h.get(&3), Some(&vec!['c']));

let b = v.iter().cloned().group::<BTreeMap<_, Vec<_>>>();
assert_eq!(b.get(&1), Some(&vec!['a', 'e', 'f']));
assert_eq!(b.get(&2), Some(&vec!['b', 'd']));
assert_eq!(b.get(&3), Some(&vec!['c']));

示例2

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoGroup;

let v = vec![Some((1, 'a')), Some((2, 'b')), Some((1, 'c'))];

let h = v.iter().cloned().group::<Option<HashMap<_, Vec<_>>>>().unwrap();
assert_eq!(h.get(&1), Some(&vec!['a', 'c']));
assert_eq!(h.get(&2), Some(&vec!['b']));

let b = v.iter().cloned().group::<Option<BTreeMap<_, Vec<_>>>>().unwrap();
assert_eq!(b.get(&1), Some(&vec!['a', 'c']));
assert_eq!(b.get(&2), Some(&vec!['b']));

let v = vec![Some((1, 'a')), None, Some((2, 'b'))];
assert!(v.iter().cloned().group::<Option<HashMap<_, Vec<_>>>>().is_none());
assert!(v.iter().cloned().group::<Option<BTreeMap<_, Vec<_>>>>().is_none());

示例3

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoGroup;

let v = vec![Ok((1, 'a')), Ok((2, 'b')), Ok((1, 'c'))];

let h = v.iter().cloned().group::<Result<HashMap<_, Vec<_>>, ()>>().unwrap();
assert_eq!(h.get(&1), Some(&vec!['a', 'c']));
assert_eq!(h.get(&2), Some(&vec!['b']));

let b = v.iter().cloned().group::<Result<BTreeMap<_, Vec<_>>, ()>>().unwrap();
assert_eq!(b.get(&1), Some(&vec!['a', 'c']));
assert_eq!(b.get(&2), Some(&vec!['b']));

let v = vec![Ok((1, 'a')), Err(()), Ok((2, 'b'))];
assert!(v.iter().cloned().group::<Result<HashMap<_, Vec<_>>, ()>>().is_err());
assert!(v.iter().cloned().group::<Result<BTreeMap<_, Vec<_>>, ()>>().is_err());

还提供扩展迭代器的选项,以将它们的值汇总到一个映射类型中,其中值是总和。

示例1

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoSummary;

let v = vec![('a', 1), ('b', 1), ('a', 2), ('b', 2), ('a', 3)];

let h = v.iter().cloned().summarize::<HashMap<_, _>>();
assert_eq!(h.get(&'a'), Some(&6));
assert_eq!(h.get(&'b'), Some(&3));

let b = v.iter().cloned().summarize::<BTreeMap<_, _>>();
assert_eq!(b.get(&'a'), Some(&6));
assert_eq!(b.get(&'b'), Some(&3));

示例2

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoSummary;

let v = vec![Some(('a', 1)), Some(('b', 2)), Some(('a', 3))];

let h = v.iter().cloned().summarize::<Option<HashMap<_, _>>>().unwrap();
assert_eq!(h.get(&'a'), Some(&4));
assert_eq!(h.get(&'b'), Some(&2));

let b = v.iter().cloned().summarize::<Option<BTreeMap<_, _>>>().unwrap();
assert_eq!(b.get(&'a'), Some(&4));
assert_eq!(b.get(&'b'), Some(&2));

let v = vec![Some(('a', 1)), None, Some(('b', 2))];
assert!(v.iter().cloned().summarize::<Option<HashMap<_, _>>>().is_none());
assert!(v.iter().cloned().summarize::<Option<BTreeMap<_, _>>>().is_none());

示例3

use std::collections::{BTreeMap, HashMap};
use iter_group::IntoSummary;

let v = vec![Ok(('a', 1)), Ok(('b', 2)), Ok(('a', 3))];

let h = v.iter().cloned().summarize::<Result<HashMap<_, _>, ()>>().unwrap();
assert_eq!(h.get(&'a'), Some(&4));
assert_eq!(h.get(&'b'), Some(&2));

let b = v.iter().cloned().summarize::<Result<BTreeMap<_, _>, ()>>().unwrap();
assert_eq!(b.get(&'a'), Some(&4));
assert_eq!(b.get(&'b'), Some(&2));

let v = vec![Ok(('a', 1)), Err(()), Ok(('b', 2))];
assert!(v.iter().cloned().summarize::<Result<HashMap<_, _>, ()>>().is_err());
assert!(v.iter().cloned().summarize::<Result<BTreeMap<_, _>, ()>>().is_err());

无运行时依赖项