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

lawou6xi  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(329)

我试图将一个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(", "));
}

这将不会编译:

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>,以便可以加入它呢?
What's an idiomatic way to print an iterator separated by spaces in Rust?中给出的示例似乎不适用,因为Args的迭代器返回String值,而HashSet的迭代器返回&String

sdnqo3pr

sdnqo3pr1#

我鼓励您重读The Rust Programming Language,特别是the chapter on iterators。接下来,熟悉Iterator的方法。
我希望看到它实现的正常方式是将HashSet转换为迭代器,然后将collect转换为Vec

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

在本例中,我更愿意直接使用FromIterator(与collect相同的特性):

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

专注于更大的问题,使用BTreeSet代替,并结合使用What's an idiomatic way to print an iterator separated by spaces in Rust?

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

j5fpnvbx2#

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

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

相关问题