我正在寻找在Vec<(String, Vec<String>)>
元组的第二部分中最常出现的字符串:
use itertools::Itertools; // 0.8.0
fn main() {
let edges: Vec<(String, Vec<String>)> = vec![];
let x = edges
.iter()
.flat_map(|x| &x.1)
.map(|x| &x[..])
.sorted()
.group_by(|x| x)
.max_by_key(|x| x.len());
}
这个:
&str
这应该给我组中最常出现的字符串,除了它不编译:
error[E0599]: no method named `max_by_key` found for type `itertools::groupbylazy::GroupBy<&&str, std::vec::IntoIter<&str>, [closure@src/lib.rs:9:19: 9:24]>` in the current scope
--> src/lib.rs:10:10
|
10 | .max_by_key(|x| x.len());
| ^^^^^^^^^^
|
= note: the method `max_by_key` exists but the following trait bounds were not satisfied:
`&mut itertools::groupbylazy::GroupBy<&&str, std::vec::IntoIter<&str>, [closure@src/lib.rs:9:19: 9:24]> : std::iter::Iterator`
我完全迷失在这些类型中。
你没看过the documentation for a function you are using。这不是一个好主意。
此类型实现
IntoIterator
(它本身不是迭代器),因为组迭代器需要从此值借用。它应该存储在局部变量中或临时并迭代。
就个人而言,我只是使用BTreeMap
或HashMap
:
let mut counts = BTreeMap::new();
for word in edges.iter().flat_map(|x| &x.1) {
*counts.entry(word).or_insert(0) += 1;
}
let max = counts.into_iter().max_by_key(|&(_, count)| count);
println!("{:?}", max);
如果你真的想使用迭代器,它可能看起来像这样:
let groups = edges
.iter()
.flat_map(|x| &x.1)
.sorted()
.group_by(|&x| x);
let max = groups
.into_iter()
.map(|(key, group)| (key, group.count()))
.max_by_key(|&(_, count)| count);