如何将HashSet的元素连接到带分隔符的String中

tsh*_*ang 3 rust

我可以做以下事情:

fn main() {
    let vec = vec!["first", "last"];
    println!("{}", vec.join(", "));
}
Run Code Online (Sandbox Code Playgroud)

它给出了这个输出:

第一,最后

如果我尝试使用join地图类型,则会失败:

错误[E0599]:没有为当前范围中的join类型命名的方法std::collections::HashSet<&str>

lje*_*drz 6

您可以将 a 转换HashSet为 an Iterator,收集它然后使用.join()

use std::collections::HashSet;

fn main() {
    let mut books = HashSet::new();

    books.insert("A Dance With Dragons");
    books.insert("To Kill a Mockingbird");
    books.insert("The Odyssey");
    books.insert("The Great Gatsby");

    println!("{}", books.into_iter().collect::<Vec<&str>>().join(", "));
}
Run Code Online (Sandbox Code Playgroud)

您可以对 a 执行相同的操作HashMap- 您只需要提取它.keys().values()首先提取它,具体取决于您要加入的那个。

  • @Tshepang 可能是因为`HashMap` 和`HashSet` 不一定包含字符串,即使它们包含,它们也是无序的。 (4认同)
  • @ljedrz `Vec` 也不一定包含字符串 :-) 我认为排序是更相关的问题。 (4认同)

She*_*ter 6

更有效率,您可以使用itertools加入迭代器而不将其收集到Vec第一个:

extern crate itertools;

use std::collections::HashSet;
use itertools::Itertools;

fn main() {
    let hash_set: HashSet<_> = ["first", "last"].iter().collect();

    // Either of
    println!("{}", hash_set.iter().join(", "));
    println!("{}", itertools::join(&hash_set, ", "));
}
Run Code Online (Sandbox Code Playgroud)