产量循环的Scala不提供预期输出

时间:2017-11-26 10:09:40

标签: scala collections equals for-comprehension

以下示例代码段:

val deck = for {
  suit <- Suit.values
  rank <- Rank.values
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)

提供以下输出:

  

Ace Hearths
  两个炉边
  三个壁炉
  四个炉边
  五个炉边
  六个Hearths
  七个壁炉   八个壁炉   Nine Hearths
  十个Hearths
  Jack Hearths
  女王Hearths
  King Hearths
  王牌钻石
  两颗钻石
  三颗钻石
  四颗钻石
  五颗钻石
  六颗钻石
  七颗钻石
  八颗钻石
  九钻石   十颗钻石
  杰克钻石
  女王钻石
  国王钻石
  Ace Spades
  两个黑桃
  三个黑桃
  四个黑桃
  五个黑桃
  六个黑桃
  七个黑桃
  八个黑桃
  九个黑桃
  十个黑桃
  Jack Spades
  女王黑桃
  King Spades   王牌俱乐部
  两个俱乐部
  三个俱乐部
  四个俱乐部
  五个俱乐部
  六个俱乐部
  七个俱乐部
  八个俱乐部
  九个俱乐部
  十个俱乐部
  杰克俱乐部
  女王俱乐部
  国王俱乐部

     

TreeSet(俱乐部的王牌,俱乐部的两个,俱乐部的三个,俱乐部的四个,俱乐部的五个,俱乐部的六个,俱乐部的七个,俱乐部的八个,俱乐部的九个,俱乐部的十个,俱乐部的杰克,女王俱乐部之王俱乐部)

我完全不知道为什么这段代码正确地遍历所有卡片,但似乎只能返回最后一件套装(作为俱乐部)

1 个答案:

答案 0 :(得分:3)

也许是因为你正在构建一个TreeSet,但你已经为PlayingCard实现了错误,所以它会丢弃你想保留的元素。如果PlayingCard.equals仅考虑卡的等级而忽略了诉讼,就会发生这种情况。

如果PlayingCard.equals被执行以便忽略该套装,那么无论何时向Set添加任何套装的Ace,它都将删除之前的Ace。这似乎是你所看到的问题。

要解决此问题,请更改PlayingCard.equals的定义以考虑诉讼或强制使用不关心相等的其他收集类型,例如Vector

val deck = for {
  suit <- Suit.values.toVector
  rank <- Rank.values.toVector
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)