質問

私が見に問題があScala2.7.7コードのように、そうはならない場合に相当したJavaで記述された.緩やかにコードが作成さんの選手カード割り当てます。

class Player(val playerNumber : Int)

class Table (val tableNumber : Int) {
    var players : List[Player]  = List()

    def registerPlayer(player : Player) {
        println("Registering player " + player.playerNumber + " on table " + tableNumber)
        players = player :: players
    }
}

object PlayerRegistrar  {
    def assignPlayersToTables(playSamplesToExecute : Int, playersPerTable:Int) = {
        val numTables = playSamplesToExecute / playersPerTable
        val tables = (1 to numTables).map(new Table(_))
        assert(tables.size == numTables)

        (0 until playSamplesToExecute).foreach {playSample =>
            val tableNumber : Int = playSample % numTables
            tables(tableNumber).registerPlayer(new Player(playSample))
        }
        tables
    }
}

のPlayerRegistrar員の選手間です。まず、作品がどのように多くのテーブルを行っていくとともに必要なの選手とトのリストを作成します。

そして第二部では、コードを動作させることができるテーブルのプレイヤーの割り当ては、引きるテーブル一覧の中からレジスタに新たなプレイヤーでいます。

リストに選手にはテーブル、var、上書きされ、各時間registerPlayer()が呼び出されます。ってはこの正常に動作しない問題をより簡単にTestNG試験:

@Test def testRegisterPlayer_multiplePlayers() {
    val table = new Table(1)
    (1 to 10).foreach { playerNumber =>
        val player = new Player(playerNumber)
        table.registerPlayer(player)
        assert(table.players.contains(player))
        assert(table.players.length == playerNumber)
    }
}

その後、試験、テーブル割:

  @Test def testAssignPlayerToTables_1table() = {
    val tables = PlayerRegistrar.assignPlayersToTables(10, 10)
    assertEquals(tables.length, 1)
    assertEquals(tables(0).players.length, 10)
}

この試験に失敗したとの"期待:<10>もった:<0>".って引掻頭ることができていない事由registerPlayer()なひとつのメカニズムのテーブルのリスト。の手によりお願い申し上げます。

役に立ちましたか?

解決

理由はassignPlayersToTables方法では、あなたが新しいTableオブジェクトを作成しているということです。あなたは、ループの中に、いくつかのデバッグを追加することでこれを確認することができます:

val tableNumber : Int = playSample % numTables
println(tables(tableNumber))
tables(tableNumber).registerPlayer(new Player(playSample))

のようなものを降伏

Main$$anon$1$Table@5c73a7ab
Registering player 0 on table 1
Main$$anon$1$Table@21f8c6df
Registering player 1 on table 1
Main$$anon$1$Table@53c86be5
Registering player 2 on table 1

テーブルのメモリアドレスは、呼び出しごとに異なる方法注

この現象の理由はRangeは、(スカラ2.8、とにかくまで)Scalaで非厳密であるということです。それが必要になるまでの範囲への呼び出しが評価されていないことをこれが意味。あなたが戻ってTableオブジェクトのリストを取得しているが、実際にあなたが(新しいTableオブジェクトをインスタンス)バックあなたはそれを呼び出すたびに評価された範囲を取得していると思うあなたはとても。ここでも、あなたには、いくつかのデバッグを追加することでこれを確認することができます:

val tables = (1 to numTables).map(new Table(_))
println(tables)
あなたを与える

RangeM(Main$$anon$1$Table@5492bbba)

、あなたがやりたい最後にtoListを追加するには:

val tables = (1 to numTables).map(new Table(_)).toList

他のヒント

val tables = (1 to numTables).map(new Table(_))

この線が原因のトラブル-マッピング以上 1 to n するこ RandomAccessSeq.Projection, で、正直なところ、わからないかを正確に働いているものの、控えめなinitialising技術の仕事です。

var tables: Array[Table] = new Array(numTables)
for (i <- 0 to numTables) tables(i) = new Table(i)

最初のトの再計算方法はなかったで変更することができるものとオブジェクト(う)ですが、簡単な配列に思うのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top