gpt4 book ai didi

rust - 如何按 Rust 中的非连续 Vec 元素分组?

转载 作者:行者123 更新时间:2023-12-05 00:55:04 25 4
gpt4 key购买 nike

我有一个 Vec<(A, B)>我想按 A 分组但不仅是连续的,而是 Vec 中的所有元素.我找到的最接近的是 Itertools::group_by 仅适用于连续值。我知道连续性与优化分配有关,但我只想要一个常规的 C# group by。优先级是不必为此使用新库。

A不可散列,仅 Ord .我想要一个结果 Vec<(A, Vec<(A, B))>或同等的

最佳答案

假设“可比”意味着A: Ord ,即在 A 上有一个总排序,您可以将迭代器折叠到 (A, B) 类型的项目上变成 BTreeMap来自 AVec<B> :

use std::collections::BTreeMap;

fn group_pairs<A, B, I>(v: I) -> BTreeMap<A, Vec<B>>
where
A: Ord,
I: IntoIterator<Item = (A, B)>,
{
v.into_iter().fold(BTreeMap::new(), |mut acc, (a, b)| {
acc.entry(a).or_default().push(b);
acc
})
}

有些人更喜欢 for 循环而不是折叠:

fn group_pairs<A, B, I>(v: I) -> BTreeMap<A, Vec<B>>
where
A: Ord,
I: IntoIterator<Item = (A, B)>,
{
let mut result = BTreeMap::<A, Vec<B>>::new();
for (a, b) in v {
result.entry(a).or_default().push(b);
}
result
}

例子:

let data = vec![(1, 2), (2, 3), (1, 1), (2, 4), (3, 5)];
let grouped = vec![(1, vec![2, 1]), (2, vec![3, 4]), (3, vec![5])];
assert_eq!(group_pairs(data).into_iter().collect::<Vec<_>>(), grouped);

关于rust - 如何按 Rust 中的非连续 Vec 元素分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65393409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com