在 Rust 的结构中查找最常出现的字符串?

5 iterator rust

我正在寻找在元组的第二部分中最常出现的字符串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());
}
Run Code Online (Sandbox Code Playgroud)

操场

这个:

  • 接受迭代器
  • 平面映射到元组的第二部分
  • 将元素变成一个 &str
  • 排序(通过 itertools)
  • 按字符串分组(通过 itertools)
  • 找到计数最高的组

这应该给了我最常出现的字符串的组,除了它不编译:

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());
}
Run Code Online (Sandbox Code Playgroud)

我完全迷失在这些类型中。

She*_*ter 6

您没有阅读正在使用的函数的文档。这不是一个好主意。

这个类型实现了IntoIterator(它本身不是迭代器),因为组迭代器需要借用这个值。它应该存储在局部变量或临时和迭代中。


就个人而言,我只使用 a BTreeMapor 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);
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用迭代器,它可能看起来像这样:

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);
Run Code Online (Sandbox Code Playgroud)