【问题标题】:How do I sort a word using the standard library?如何使用标准库对单词进行排序?
【发布时间】:2021-07-21 08:07:38
【问题描述】:

我想从 String 创建一个排序的单词

这是我目前所拥有的。

fn sort_word(word: &str) -> String {
    word.chars()
        .collect::<Vec<char>>()
        .sort_unstable()
        .iter()
        .collect()
}

我不明白编译器消息:

error[E0599]: no method named `iter` found for unit type `()` in the current scope
 --> src/lib.rs:5:10
  |
5 |         .iter()
  |          ^^^^ method not found in `()`

我在这里做错了什么?

【问题讨论】:

  • sort_unstable 不返回值(与返回 () 相同)。它只是对给定的切片进行排序。
  • That sorting method 不返回排序后的切片。更喜欢按照这里的建议进行操作:stackoverflow.com/q/54701548
  • 啊,没关系!感谢您指出显而易见的。是的,我最初使用了 sorted 但只想用std 来破解它

标签: rust


【解决方案1】:

如果它对任何人有帮助

fn sort_word(word: &str) -> String {
    let mut cvec = word.chars().collect::<Vec<_>>();
    cvec.sort_unstable();
    cvec.iter().collect()
}

【讨论】:

    【解决方案2】:

    只是为了好玩和有其他选择,您可以使用HashMap 来计算项目,然后重构整个字符串。

    以下是 ASCII 字符的示例:

    use std::collections::HashMap;
    use std::iter;
    
    fn sort_string(s: &str) -> String {
        let mut counter = HashMap::new();
        for c in s.chars() {
            *counter.entry(c).or_insert(0usize) += 1;
        }
        (0..=255)
            .map(char::from)
            .filter_map(|c| counter.get(&c).map(|n| iter::repeat(c).take(*n)))
            .flatten()
            .collect()
    }
    

    Playground

    【讨论】:

    • 感谢您抽出宝贵时间回答。您能否解释一下为什么您的解决方案比发布的第一个更好?如何在 Rust 中运行时间比较?
    • @Chapo,我不确定运行时间。但是由于您不需要构建中间 vec,因此中间分配中的时间恒定为 255。对于运行时间,我们将不得不运行一些基准测试。稍后我会安排他们,并在我有时间的时候更新:)
    猜你喜欢
    • 2015-08-16
    • 2011-04-11
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多