Scala的Set
层次是有点怪异,但它是BitSet
具有Set[Int]
作为超类型的情况下,所以你可以简单地传递一个BitSet
给需要一个Set[Int]
,方法等
这可能不是似乎是这种情况,因为您默认获得的Set
是immutable.Set
(在scala.collection
下),但您正在使用的库可能与BitSet
直接在scala.collection
下工作,而不是immutable.BitSet
。在您的示例代码中,情况并非如此,其中所有内容均位于immutable
中,但我不确定这是多么简单。
如果你足够幸运,既Set
和BitSet
的immutable
包的版本中,BitSet
到Set
方向是平凡的合作:
scala> import scala.collection.immutable.BitSet
import scala.collection.immutable.BitSet
scala> val bs = BitSet(0, 100, 200)
bs: scala.collection.immutable.BitSet = BitSet(0, 100, 200)
scala> def takesSet(s: Set[Int]): Int = s.size
takesSet: (s: Set[Int])Int
scala> takesSet(bs)
res0: Int = 3
如果不知为何,你已经有了一个scala.collection.BitSet
,只是使用toSet
:
scala> takesSet(scala.collection.BitSet(0, 100, 200).toSet)
res1: Int = 3
对于其他方向,你的版本是好的:
scala> val s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> BitSet(s.toSeq: _*)
res2: scala.collection.immutable.BitSet = BitSet(1, 2, 3)
但同样值得注意的是,在很多情况下,你可以避免这种转换有一些CanBuildFrom
魔术:
scala> val bs: BitSet = Set("1", "2", "3").map(_.toInt)(collection.breakOut)
bs: scala.collection.immutable.BitSet = BitSet(1, 2, 3)
这将产生相同的结果如下:
scala> val bs: BitSet = BitSet(Set("1", "2", "3").map(_.toInt).toSeq: _*)
bs: scala.collection.immutable.BitSet = BitSet(1, 2, 3)
但是相反在BitSet
之前构建中间集合(和序列),参数collection.breakOut
通知编译器使用CanBuildFrom
的实例执行映射类型类将直接构造BitSet
。以这种方式显式传递CanBuildFrom
实例不仅仅适用于map
,它可以与flatMap
,scanLeft
,++
以及其他允许您更改元素类型的集合操作一起使用。
第二,'.toSet'或'.seq'应该可以工作 – Bergi
也许[初始化一个范围内的scala BitSet](http://stackoverflow.com/q/6366976/1048572)对第一个 – Bergi