2016-09-29 25 views
1

私はデッキをシャッフルするプログラムを作成中です。ケースクラスのカードには、インッツ、スーツ、バリューの2つが必要です。私は、52枚のカードをすべて作成して配列に入れるためにyieldを使用したいと考えています。私はこれを試しましたが、yieldは2番目のforループを生成するものとして考慮しているので、units(Array [Unit])を持つ配列を取得します。この問題を回避する方法はありますか?forループ内でのforループからの収穫(Scala)

ps。申し訳ありませんが、私の質問が不明な場合は、ここで2回目の質問です。ここで

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

答えて

1

理解のための

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あなたがALSできる

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)" 
+0

ありがとうございます!完璧に動作します! – arachane

+0

@arachaneこれが便利な場合は解決策を受け入れることを忘れないでください – pamu

0

を使用する方法でありますo "double-iteration"を行うにはこのようなことをしますが、ここに該当するかどうかはわかりません。最初の答えは私がそれをやっただろうが、これは別の選択肢です。

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

ありがとう!完璧に動作します! – arachane