如何将一个包含字符串的HashSet转换成Vector?

24

我试图将一个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>以便进行连接?

在Rust中以惯用方式打印迭代器并以空格分隔的示例不适用,因为Args的迭代器返回String值,而HashSet的迭代器返回&String


1
你可以调用 into_iter 以获取这些值的所有权。 - squiguy
“HashSet”的迭代器可以返回“&String”类型。是的,它有许多这样的迭代器。但也有一些不会。您也可以很好地格式化一个“&String”。 - Shepmaster
2个回答

39

我鼓励你重新阅读The Rust Programming Language,特别是迭代器章节。接下来,熟悉Iterator的方法。

我期望看到这个实现的正常方式是将HashSet转换为迭代器,然后将迭代器收集到Vec中:

let mut v: Vec<_> = hs.into_iter().collect();
在这种情况下,我更喜欢直接使用FromIterator(与collect相同的trait):
let mut v = Vec::from_iter(hs);

关注你更大的问题,使用BTreeSet代替,并结合在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(", "));
}

1
我正在第一次阅读《Rust编程语言》途中。我通过改变为HashSet<&'static str>的方式使其工作。这个更改之后,join函数正常运行。在我的情况下,使用&'static str是可以的,因为HashSet仅包含字符串字面量。 - Ralph
hs 是一个 HashSet(而不是迭代器)时,为什么 Vec::from_iter(hs) 能够工作? - MEMark
1
@MEMark请查看FromIterator的定义,您会发现它接受任何可以转换为迭代器的值,而不仅仅是已经是迭代器的值。 - Shepmaster

1

使用turbofish(::<>)有一个简单的方法将HashSet中的String转换为Vec中的String

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

2
在变量和turbofish上同时指定类型是多余的。在集合内部指定类型也是多余的。我会这样写:let result_vec = result_set.into_iter().collect::<Vec<_>>() - Shepmaster

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