以下示例代码片段:
val deck = for {
suit <- Suit.values
rank <- Rank.values
} yield {
println(s"$rank $suit")
PlayingCard(suit, rank)
}
print(deck)提供下列输出:
Ace炉 双炉 三炉 四炉 五炉 六炉 七炉 八炉 九炉 十炉 千斤顶炉 皇后炉 国王壁炉 Ace钻石 两颗钻石 三颗钻石 四颗钻石 五颗钻石 六颗钻石 七颗钻石 八颗钻石 九颗钻石 十颗钻石 杰克钻石 皇后钻石 国王钻石 王牌黑桃 双黑桃 三黑桃 四黑桃 五黑桃 六黑桃 七黑桃 八黑桃 九黑桃 十个黑桃 杰克黑桃 皇后黑桃 黑桃王 Ace俱乐部 两个俱乐部 三个俱乐部 四个俱乐部 五个俱乐部 六个俱乐部 七个俱乐部 八个俱乐部 九个俱乐部 十个俱乐部 杰克俱乐部 皇后俱乐部 国王俱乐部(TreeSet)(俱乐部有两家,俱乐部两家,俱乐部三家,俱乐部四家,俱乐部五家,俱乐部六家,俱乐部七家,俱乐部八家,俱乐部九家,俱乐部十家,俱乐部杰克,俱乐部女王,俱乐部之王)
我完全不知道为什么这段代码会正确地迭代所有的卡片,但似乎只返回了最后一套(作为俱乐部)。
发布于 2017-11-26 10:24:11
可能是因为您正在构建一个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)https://stackoverflow.com/questions/47494980
复制相似问题