如何将一个HashSet的所有值插入另一个HashSet?

时间:2019-05-15 11:45:00

标签: rust union hashset

我有两个HashSet<u16>,我想实现a = a U b。如果可能的话,我想使用HashSet::union而不是循环或其他调整。

我尝试了以下操作:

use std::collections::HashSet;
let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
let b: HashSet<u16> = [7, 8, 9].iter().cloned().collect();  

// I can build a union object that contains &u16
let union: HashSet<&u16> = a.union(&b).collect();

// But I can't store the union into a
a = a.union(&b).collect();   //  -> compile error

// of course I can do
for x in &b {
    a.insert(*x);
}
// but I wonder if union could not be used to simply build a union

错误消息如下:

the trait bound 
`std::collections::HashSet<u16>: std::iter::FromIterator<&u16>`
is not satisfied

如何执行a = a U a

2 个答案:

答案 0 :(得分:3)

您不想要union -如您所说,它将创建一个新的HashSet。相反,您可以使用Extend::extend

use std::collections::HashSet;

fn main() {
    let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
    let b: HashSet<u16> = [1, 3, 7, 8, 9].iter().cloned().collect();

    a.extend(&b);

    println!("{:?}", a);
}

Playground

Extend::extend也是implemented for other collections,例如VecVec的结果会有所不同,因为Vec不会像Set那样重复复制。

答案 1 :(得分:-1)

<块引用>
// But I can't store the union into a
a = a.union(&b).collect();   //  -> compile error

错误信息如下:

the trait bound  `std::collections::HashSet<u16>:
std::iter::FromIterator<&u16>` is not satisfied

这是因为 aHashSet<u16>,而 a.union(&b)Iterator<Item=&u16>。使用 a.union(&b)Iterator<Item=u16> 转换为 .copied() 有效:

a = a.union(&b).copied().collect(); // compiles

正如另一个提到的,这将创建一个新的 HashSet。在某些情况下,这可能是您想要的,但如果将其分配给另一个变量会更有意义:

let c: HashSet<u16> = a.union(&b).copied().collect();

// a is unchanged here