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

时间:2019-03-01 00:30:40

标签: rust iterator

我正在寻找最常见于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());
}

Playground

此:

  • 采用迭代器
  • 平面映射到元组的第二部分
  • 将元素转换为&str
  • (通过itertools)对其进行排序
  • 通过字符串将其分组(通过itertools)
  • 找到人数最多的组

这应该为我提供了出现频率最高的字符串组,但它无法编译:

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`

我完全迷失了这些类型。

1 个答案:

答案 0 :(得分:3)

您没有阅读the documentation for a function you are using。这不是一个好主意。

  

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


我个人将只使用BTreeMapHashMap

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);