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

问题描述 投票:1回答:1

我正在寻找在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`

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

rust iterator
1个回答
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);
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.