我正在尝试转换 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
.
最佳答案
我鼓励您重新阅读 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;
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(", "));
}
关于vector - 如何将字符串的 HashSet 转换为向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60893051/