Scala枚举比较顺序

时间:2016-10-18 09:46:59

标签: scala enums compare enumeration

object CardNum extends Enumeration
{
    type CardNum = Value;
    val THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
    TEN, JACK, QUEEN, KING, ACE, TWO = Value
}

上面显示了我的枚举。我想比较枚举的顺序,例如检查它是否遵循枚举中定义的顺序。我尝试使用compareTo()方法,但它只返回-1,0或1的值。与Java不同,它将返回枚举之间的距离。例如,我使用了这段代码。

1 - println(CardNum.FIVE.compareTo(CardNum.EIGHT))
2 - println(CardNum.SEVEN.compareTo(CardNum.EIGHT))

句子1和句子2都给出了与-1相同的结果,这使我无法检测用户是否遵循枚举的顺序。在Java中没有问题,因为句子1会给我结果-3和句子2 -1。有没有办法在Scala中这样做?对不起,我对Scala缺乏经验。

2 个答案:

答案 0 :(得分:1)

您可以使用元素id之间的差异:

scala> CardNum.FIVE.id - CardNum.EIGHT.id
res1: Int = -3

scala> CardNum.SEVEN.id - CardNum.EIGHT.id
res2: Int = -1

答案 1 :(得分:0)

您应该包含Kolmar描述的逻辑,以了解枚举中两张卡之间的距离或使用隐式类,这样可以更简单地搜索代码中的引用,并以透明的方式进行更改(例如,这将允许你要改变枚举顺序)

枚举内

object CardNum extends Enumeration {

  protected case class CardVal() extends super.Val {
    def distance(that: CardVal) = this.id - that.id
  }
  type CardNum = Val;
  val THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
  TEN, JACK, QUEEN, KING, ACE, TWO = CardVal()
}

使用隐式类

implicit class EnhancedCard(card: CardNum.CardNum) {
  def distance(that: CardNum.CardNum): Int = card.id - that.id
}

使用此解决方案,您需要在范围内使用隐式类。