如何在Scala中找到最小和最大的笛卡尔坐标

时间:2012-01-17 07:36:56

标签: scala conways-game-of-life

我正在尝试解决Scala中的GameOfLife,我有一个infinte网格。我试图将网格表示为一组单元格(x,y)。当我从String中读到时,我从(0,0)开始。 但是由于GameOfLife的规律,并且因为在将规则应用到我的Generation类之后我正在考虑无限网格,我想打印当前一代。

这里我不知道如何计算最小位置(读取x,y迭代器)从何处开始迭代并打印活动单元格的'X'和用于该Generation的GameOfLife中的死细胞的' - '。我是提供我的生成类的toString方法的天真解决方案。 但我对此并不满意。有人可以建议更好的解决方案吗?

override def toString:String = 
   {
        val output:StringBuilder = new StringBuilder();
        val minOfRowColumn = for
        {
          cell <- aliveCells
          row = cell.row
          column = cell.column
        } yield if( row < column ) row else column

        val min = minOfRowColumn.min

        val maxOfRowColumn = for
        {
          cell <- aliveCells
          row = cell.row
          column = cell.column
        } yield if( row > column ) row else column

        val max = maxOfRowColumn.max

        var row = min;
        var column = min;

        while(row <= max)
        {
          while(column <= max)
          {
            if(aliveCells.contains(Cell(row,column)))
            {
              output.append('X')
            }
            else
              output.append('-')
            column = column + 1
          }
          output.append("\n");
          column = min
          row = row + 1
        }


        //remove the last new line addded.
        val indexOfNewLine = output.lastIndexOf("\n");
        if( -1 != indexOfNewLine )
        output.delete(indexOfNewLine,output.length());

        return output.toString();
   }

aliveCells这里是一个Set [Cell],其中Cell是Cell(x,y)的一个案例类。

1 个答案:

答案 0 :(得分:1)

我建议使用以下代码:

override def toString = {
  val min = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).min
  val max = aliveCells.iterator.flatMap(c => Seq(c.row, c.column)).max

  (min to max) map { row =>
    (min to max) map (col => if (aliveCells(Cell(row, col))) "X" else "-") mkString
  } mkString ("\n")
}

如果您不特别想要平方网格,则可能需要将最小/最大列和行分开:

val minC = aliveCells.iterator.map(_.column).min

等等。