首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala的收益率循环没有提供预期的输出

Scala的收益率循环没有提供预期的输出
EN

Stack Overflow用户
提问于 2017-11-26 10:09:40
回答 1查看 52关注 0票数 0

以下示例代码片段:

代码语言:javascript
复制
val deck = for {
  suit <- Suit.values
  rank <- Rank.values
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)

提供下列输出:

Ace炉 双炉 三炉 四炉 五炉 六炉 七炉 八炉 九炉 十炉 千斤顶炉 皇后炉 国王壁炉 Ace钻石 两颗钻石 三颗钻石 四颗钻石 五颗钻石 六颗钻石 七颗钻石 八颗钻石 九颗钻石 十颗钻石 杰克钻石 皇后钻石 国王钻石 王牌黑桃 双黑桃 三黑桃 四黑桃 五黑桃 六黑桃 七黑桃 八黑桃 九黑桃 十个黑桃 杰克黑桃 皇后黑桃 黑桃王 Ace俱乐部 两个俱乐部 三个俱乐部 四个俱乐部 五个俱乐部 六个俱乐部 七个俱乐部 八个俱乐部 九个俱乐部 十个俱乐部 杰克俱乐部 皇后俱乐部 国王俱乐部(TreeSet)(俱乐部有两家,俱乐部两家,俱乐部三家,俱乐部四家,俱乐部五家,俱乐部六家,俱乐部七家,俱乐部八家,俱乐部九家,俱乐部十家,俱乐部杰克,俱乐部女王,俱乐部之王)

我完全不知道为什么这段代码会正确地迭代所有的卡片,但似乎只返回了最后一套(作为俱乐部)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-26 10:24:11

可能是因为您正在构建一个TreeSet,但是您错误地实现了PlayingCard的等式,因此它放弃了您想要保留的元素。如果PlayingCard.equals只考虑卡的等级,而忽略了套装,这就会发生。

如果PlayingCard.equals的实现使得它忽略了诉讼程序,那么每当您向Set中添加任何西装的Ace时,它都会删除以前的Ace。这似乎是你看到的问题。

要解决这个问题,要么更改PlayingCard.equals的定义以考虑是否合适,要么强制使用不关心相等的不同集合类型,例如Vector

代码语言:javascript
复制
val deck = for {
  suit <- Suit.values.toVector
  rank <- Rank.values.toVector
} yield {
  println(s"$rank $suit")
  PlayingCard(suit, rank)
}
print(deck)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47494980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档