Scala从另一组初始化set

时间:2015-05-28 00:16:50

标签: scala set

目前尚不清楚如何从现有的Set中创建新的Set。

scala> val s = Set(1,2,3)

尝试直接在构造函数中添加s:

scala> val v = Set(s)
v: scala.collection.mutable.Set[scala.collection.mutable.Set[Int]] = Set(Set(1, 2, 3))

嗯,这是嵌套设置..

因此,让我们尝试采用每个元素:

val v = Set[Int](s:_*)
<console>:13: error: type mismatch;
 found   : scala.collection.mutable.Set[Int]
 required: Seq[Int]
       val v = Set[Int](s:_*)

列表怎么样?

val v = Set(  s.toList)
v: scala.collection.mutable.Set[List[Int]] = Set(List(1, 2, 3))

3 个答案:

答案 0 :(得分:3)

您可能已经尝试toSet并发现您只回到同一个Set,但另一种选择是使用to[Col[_]],将Set作为 Col[_]为您提供了一个新的集合:

scala> val s = Set(1, 2, 3)
scala> System.identityHashCode(s)
  res0: Int = 908978764

scala> val v = s.toSet
scala> System.identityHashCode(v)
  res1: Int = 908978764              // No good - same object 

scala> val w = s.to[Set]
scala> System.identityHashCode(w)
  res2: Int = 1069495836             // New object

它比@ dk14的方法更有效吗?我不知道。但对于随意的读者来说,这可能会更加明显。

答案 1 :(得分:1)

复制(复制)Traversable的一般方法,只需迭代每个项目,

val v = s.map(identity)

答案 2 :(得分:0)

你几乎到了那里:

scala> val v = Set(s.toSeq: _*)
v: scala.collection.immutable.Set[Int] = Set(1, 2, 3)