など、ScalaのSet
階層は少し奇妙ですが、それは、BitSet
がスーパータイプとしてSet[Int]
を持っているので、あなたは、単にSet[Int]
を期待するメソッドにBitSet
を渡すことができるという場合である
これはないかもしれません実際には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
,などで動作し、要素タイプを変更できる他のコレクション操作の場合もあります。BitSet
がSet[Int]
で、あなたが他の1つを変換するために何かをする必要はありません:
'.toSet'または' .seq'はうまくいくはずです – Bergi
[範囲からのスカラビットセットの初期化](http://stackoverflow.com/q/6366976/1048572)は最初の – Bergi