我有这个简单的不可变的基于 Long 的位集,其中包含Card
案例类。不幸的是,随着 Scala 2.13 集合的改进,它不再编译了。
我看过 Scala 2.13 中的 BitSet 实现,但它非常冗长。我将如何在保持代码简洁明了的同时转换这个类?是否有我可以构建的这种数据结构的演示示例?
import scala.collection.{GenSet, GenTraversableOnce, SetLike}
case class Card(ord: Int)
case class Deck(data: Long) extends Set[Card] with SetLike[Card, Deck] {
def iterator = new Iterator[Card] {
var cur = data
def next = {
val res = java.lang.Long.numberOfTrailingZeros(cur)
cur &= ~(1L << res)
Card(res)
}
def hasNext = cur != 0
}
override def empty: Deck = Deck.empty
override def size: Int = java.lang.Long.bitCount(data)
override def contains(card: Card): Boolean = (data & (1L << card.ord)) > 0
override def +(card: Card): Deck = Deck(data | (1L << card.ord))
override def -(card: Card): Deck = Deck(data & ~(1L << card.ord))
private def toBits(deck: GenTraversableOnce[Card]): Long = deck match {
case deck: Deck => deck.data
case _ =>
var data = 0L
for (card <- deck) data |= 1L << card.ord
data
}
override def ++(deck: GenTraversableOnce[Card]): Deck = Deck(data | toBits(deck))
override def &(deck: GenSet[Card]): Deck = Deck(data & toBits(deck))
override def diff(deck: GenSet[Card]): Deck = Deck(data & ~toBits(deck))
}
object Deck {
val empty: Deck = Deck(0)
def of(deck: Iterable[Card]): Deck = empty ++ deck
}