【问题标题】:yield from for-loop within a for-loop (Scala)从 for 循环中的 for-loop 产生 (Scala)
【发布时间】:2017-02-07 20:54:13
【问题描述】:

我正在开发一个洗牌程序。案例类 Card 需要两个整数,花色和价值。我想使用 for yield 创建所有 52 张卡片并将它们放入一个数组中。我试过这个,但是由于yield将第二个for循环视为要产生的东西,所以我得到了一个带有单位的数组(Array [Unit])。有没有办法解决这个问题?

附言。抱歉,如果我的问题不清楚,这是我第二次在这里提问。

lazy val cards: Array[Card] = (
for (i <- 1 to 52) yield {
  for (j <- 1 to 4) Card(j,i)
}).toArray

【问题讨论】:

    标签: arrays scala for-loop yield


    【解决方案1】:

    这里是如何使用 for 理解

    lazy val cards: Array[Card] = (for (i <- 1 to 52; j <- 1 to 4) yield Card(j, i)).toArray
    

    多行理解

       lazy val cards: Array[Card] =
        (for {
          i <- 1 to 52
          j <- 1 to 4
         } yield Card(j,i)).toArray
    

    Scala REPL

    scala> case class Card(j: Int, i: Int)
    defined class Card
    
    scala> lazy val cards: Array[Card] =
         (for {
           i <- 1 to 52
           j <- 1 to 4
          } yield Card(j,i)).toArray
    cards: Array[Card] = <lazy>
    
    scala> cards.mkString(" ")
    res6: String = "Card(1,1) Card(2,1) Card(3,1) Card(4,1) Card(1,2) Card(2,2) Card(3,2) Card(4,2) Card(1,3) Card(2,3) Card(3,3) Card(4,3) Card(1,4) Card(2,4) Card(3,4) Card(4,4) Card(1,5) Card(2,5) Card(3,5) Card(4,5) Card(1,6) Card(2,6) Card(3,6) Card(4,6) Card(1,7) Card(2,7) Card(3,7) Card(4,7) Card(1,8) Card(2,8) Card(3,8) Card(4,8) Card(1,9) Card(2,9) Card(3,9) Card(4,9) Card(1,10) Card(2,10) Card(3,10) Card(4,10) Card(1,11) Card(2,11) Card(3,11) Card(4,11) Card(1,12) Card(2,12) Card(3,12) Card(4,12) Card(1,13) Card(2,13) Card(3,13) Card(4,13) Card(1,14) Card(2,14) Card(3,14) Card(4,14) Card(1,15) Card(2,15) Card(3,15) Card(4,15) Card(1,16) Card(2,16) Card(3,16) Card(4,16) Card(1,17) Card(2,17) Card(3,17) Card(4,17) Card(1,18) Card(2,18) Card(3,18) Card(4,18) Card(1,19) Card(2,19) Card(3,19) Card(4,19) Card(1,20) Card(2,20) Card(3,20) Card(4,20) Card(1,21) Card(2,21) Card(3,21) Card(4,21) Card(1,22) Card(2,22) Card(3,22) Card(4,22) Card(1,23) Card(2,23) Card(3,23) Card(4,23) Card(1,24) Card(2,24) Card(3,24) Card(4,24) Card(1,25) Card(2,25) Card(3,25) Card(4,25) Card(1,26) Card(2,26) Card(3,26) Card(4,26) Card(1,27) Card(2,27) Card(3,27) Card(4,27) Card(1,28) Card(2,28) Card(3,28) Card(4,28) Card(1,29) Card(2,29) Card(3,29) Card(4,29) Card(1,30) Card(2,30) Card(3,30) Card(4,30) Card(1,31) Card(2,31) Card(3,31) Card(4,31) Card(1,32) Card(2,32) Card(3,32) Card(4,32) Card(1,33) Card(2,33) Card(3,33) Card(4,33) Card(1,34) Card(2,34) Card(3,34) Card(4,34) Card(1,35) Card(2,35) Card(3,35) Card(4,35) Card(1,36) Card(2,36) Card(3,36) Card(4,36) Card(1,37) Card(2,37) Card(3,37) Card(4,37) Card(1,38) Card(2,38) Card(3,38) Card(4,38) Card(1,39) Card(2,39) Card(3,39) Card(4,39) Card(1,40) Card(2,40) Card(3,40) Card(4,40) Card(1,41) Card(2,41) Card(3,41) Card(4,41) Card(1,42) Card(2,42) Card(3,42) Card(4,42) Card(1,43) Card(2,43) Card(3,43) Card(4,43) Card(1,44) Card(2,44) Card(3,44) Card(4,44) Card(1,45) Card(2,45) Card(3,45) Card(4,45) Card(1,46) Card(2,46) Card(3,46) Card(4,46) Card(1,47) Card(2,47) Card(3,47) Card(4,47) Card(1,48) Card(2,48) Card(3,48) Card(4,48) Card(1,49) Card(2,49) Card(3,49) Card(4,49) Card(1,50) Card(2,50) Card(3,50) Card(4,50) Card(1,51) Card(2,51) Card(3,51) Card(4,51) Card(1,52) Card(2,52) Card(3,52) Card(4,52)"
    

    【讨论】:

    • 谢谢!完美运行!
    • @arachane 如果有用,别忘了接受解决方案
    【解决方案2】:

    你也可以做这样的事情来做“双迭代”,但我不知道这是否适用于这里。第一个答案是我会怎么做,但这是另一种选择。

    for(b <- books; a <- b.authors if a startsWith "Bird, ") yield b.title
    

    【讨论】:

    • 谢谢!完美运行!
    猜你喜欢
    • 2011-10-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多