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

How do I convert a HashSet of Strings into a Vector?

我正在尝试将 HashSet<String> 转换为排序向量,然后可以用逗号 joined:

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(", "));
}

这不会编译:

error[E0599]: no method named `join` found for struct `std::vec::Vec<&std::string::String>` in the current scope
  --> src/main.rs:13:22
   |
13 |     println!("{}", v.join(", "));
   |                      ^^^^ method not found in `std::vec::Vec<&std::string::String>`

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

中给出的示例似乎不适用,因为 Args returns String 值的迭代器不同于 HashSet 的迭代器returns &String.

我鼓励您重新阅读 The Rust Programming Language, specifically the chapter on iterators. Next, become familiar with the methods of Iterator

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

let mut v: Vec<_> = hs.into_iter().collect();

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

let mut v = Vec::from_iter(hs);

专注于更大的问题,改用 BTreeSet,再加上

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

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

    println!("{}", hs.iter().format(", "));
}

有一种直接的方法可以使用涡轮鱼 (::<>) 将 StringHashSet 转换为 StringVec

let result_vec: Vec<String> = result_set.into_iter().collect::<Vec<String>>();