如何将字符串的 HashSet 转换为向量?

Ral*_*lph 7 vector hashset rust borrowing

我正在尝试将 a 转换HashSet<String>为一个排序向量,然后可以join用逗号进行编辑:

use std::collections::HashSet;

fn main() {
    let mut hs = HashSet::<String>::new();
    hs.insert(String::from("fee"));
    hs.insert(String::from("fie"));
    hs.insert(String::from("foo"));
    hs.insert(String::from("fum"));

    let mut v: Vec<&String> = hs.iter().collect();
    v.sort();

    println!("{}", v.join(", "));
}
Run Code Online (Sandbox Code Playgroud)

这不会编译:

use std::collections::HashSet;

fn main() {
    let mut hs = HashSet::<String>::new();
    hs.insert(String::from("fee"));
    hs.insert(String::from("fie"));
    hs.insert(String::from("foo"));
    hs.insert(String::from("fum"));

    let mut v: Vec<&String> = hs.iter().collect();
    v.sort();

    println!("{}", v.join(", "));
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么我不能加入Vec<&String>,但我怎样才能将 转换HashSet为 a Vec<String>,以便它可以加入?

在 Rust 中打印由空格分隔的迭代器的惯用方法什么?似乎并不适用,因为迭代器Args返回String值,不像迭代器HashSet返回&String

She*_*ter 13

我鼓励你重新阅读Rust 编程语言,特别是关于迭代器的章节。接下来,熟悉 的方法Iterator

我希望看到这种实现的正常方法是将 the 转换HashSet为迭代器,然后collect将迭代器转换为 a Vec

let mut v: Vec<_> = hs.into_iter().collect();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我更愿意FromIterator直接使用(与 powers 相同的特征collect):

let mut v = Vec::from_iter(hs);
Run Code Online (Sandbox Code Playgroud)

专注于更大的问题,使用 aBTreeSet代替,再加上在 Rust 中打印由空格分隔的迭代器的惯用方法是什么?

use itertools::Itertools;
use std::collections::BTreeSet; // 0.9.0

fn main() {
    // Create the set somehow
    let hs: BTreeSet<_> = ["fee", "fie", "foo", "fum"]
        .iter()
        .copied()
        .map(String::from)
        .collect();

    println!("{}", hs.iter().format(", "));
}
Run Code Online (Sandbox Code Playgroud)