如何在Rust中对字符串的字符进行排序?

12

我有一个字符串 "laxmi",需要按字母降序排列,输出 "xmlia"。我已经写了如下代码:

fn main() {
    let wordy: String = "I am a hello world example";

    let chars: Vec<char> = wordy.chars().vector();
    chars.sort_by(|a, b| b.cmp(a));

    // let s: String = chars.into_iter().collect();
    println!("test{:?}", chars);
    let s = String::from_iter(chars);
    println!("{}", s);
}

只有在 wordy 是一个 &str 类型时才有效,但我有一个 String 类型。我该如何将 String 转换为 char 向量以便对字符串进行排序?


2
这甚至不是有效的代码,所以我不理解你如何说“这只能运行...”。它会产生多个错误:类型不匹配未找到类型std :: str :: Chars<'_'>vector方法; *未找到类型std :: string :: String的关联项from_iter*。请在在Stack Overflow上提问时,请仔细查看如何创建[MCVE]。 - Shepmaster
2个回答

16

我这样做得到了所需的输出,但这可能不是最好的方法。

use std::iter::Iterator;
use std::iter::FromIterator;

fn main() {
    let wordy: String = "I am a hello world example".to_owned();
    let s_slice: &str = &wordy[..];

    let mut chars: Vec<char> = s_slice.chars().collect();
    chars.sort_by(|a, b| b.cmp(a));

    println!("test{:?}", chars);
    let s = String::from_iter(chars);
    println!("{}", s);
}

@Shepmaster,我不知道你是怎么出现这个错误的。但是我得到了正确的输出结果,没有错误。整个程序与头文件已在答案中进行了编辑。我能够编译程序而没有错误。你可能忘记了使用std::iter::FromIterator;头文件。 - user5335302
3
我复制了你的代码并运行它,出现了错误。因为你没有提供完整的有效示例,所以出错了。如果你不提供代码,其他人怎么能知道该使用什么呢? - Shepmaster
2
请注意,您可以使用chars.into_iter().collect::<String>()代替String::from_iter(来自FromIterator)。 - sigod

3

如果您可以使用Crate,那么可以使用itertools Crate来简化很多东西。

将crate添加到您的Cargo.toml中:

[dependencies]
itertools = "0.9.0"

然后在您的文件中使用它来对字符串进行排序和反转。

use itertools::Itertools;

fn main() {
    let wordy = "I am a hello world example";

    let s = wordy.chars().sorted().rev().collect::<String>();

    println!("{}", s);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接