gpt4 book ai didi

scala - 在 Scala 中将 BitSet 设置为 Set[Int] 或反之亦然

转载 作者:行者123 更新时间:2023-12-05 00:56:18 24 4
gpt4 key购买 nike

我有一个使用 BitSet 的库,我需要更改 Set[Int] 类型数据才能使用该库。

想到的是使用.toSeq:_*操作,但我不确定这是从 BitSet 转换为 Set[Int] 或相反的有效方法。

scala> BitSet(Set(1,2,3).toSeq:_*)
res55: scala.collection.immutable.BitSet = BitSet(1, 2, 3)

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

有没有更好的办法?

最佳答案

斯卡拉的 Set层次结构有点奇怪,但BitSet 确实如此。有 Set[Int]作为父类(super class)型,所以你可以简单地传递一个 BitSet到一个需要 Set[Int] 的方法, 等等。

情况似乎并非如此,因为 Set你默认得到的是 immutable.Set (在 scala.collection 下),虽然您正在使用的库可能正在使用 BitSet直属scala.collection ,不是 immutable.BitSet .在您的示例代码中,情况并非如此,所有内容都在 immutable 中。 ,但我不确定这有多简单。

如果您有幸与 immutable 合作两个软件包的版本 SetBitSet , BitSetSet方向很简单:

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 , ++ ,以及其他允许您更改元素类型的集合操作。

关于scala - 在 Scala 中将 BitSet 设置为 Set[Int] 或反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36377201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com