以下示例代码段:
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(俱乐部的王牌,俱乐部的两个,俱乐部的三个,俱乐部的四个,俱乐部的五个,俱乐部的六个,俱乐部的七个,俱乐部的八个,俱乐部的九个,俱乐部的十个,俱乐部的杰克,女王俱乐部之王俱乐部)
我完全不知道为什么这段代码正确地遍历所有卡片,但似乎只能返回最后一件套装(作为俱乐部)
答案 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)