1

I'm working on a program to shuffle a deck. The case class Card requires two Ints, suit and value. I want to use a for yield to create all 52 cards and putting them in an array. I tried this but since yield considers the second for loop as the thing to yield I get an array with units (Array[Unit]). Is there any way to go around this issue?

Ps. Sorry if my question is unclear it's my second time asking a question here.

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

2 Answers 2

1

Here is how to use the for comprehension

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

multi-line for-comprehension

   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)"
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks! Works perfectly!
@arachane dont forget to accept the solution if this is useful
0

You can also do something like this to do “double-iteration”, but I don’t know if that’s applicable here. The first answer is how I would have done it but this is another option.

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

1 Comment

Thanks! Works perfectly!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.