2016-03-29 4 views
1

私は81文字の文字列を解析する関数を作成しました。それを解析する際には、指定された行と列から垂直、水平、対角のすべての座標を返すneighbors(Int: row, Int: col)という関数を使用する必要があります。この座標のリストでは、各座標にリストされている可能な値のそれぞれから取り出された値を削除する必要があります。ボードはマップとして表されており、これを機能的に、つまりvarを使わずに実行する必要があります。スカラは、ボードで表されるマップを反復処理します

ここに私の解析機能です:

str.zipWithIndex.map{ 
    case (digit, index) => ((index/9, index % 9), List(digit.asDigit)) 
    }.toMap 

は、ここで私はneighbors機能について知っていることだ。たとえば

def neighbors(row: Int, col: Int): List[(Int, Int)] 

、パーサは(0,2)座標上にあった、と数が締結した場合地図は4だったので、その点から垂直、水平、斜めのすべての座標から4を削除しなければならなかった。各ポイントの値は、可能な値のリストとして表されます。

また、neighbor機能の実装についても説明しません。

ありがとうございました!

+0

第一 - 私は[カールの提案](http://stackoverflow.com/questions/36266982/scala-returning-coordinate-as-tuple)は、あなたのパーサーのより良いデザインだと思いました。第2回 - 正確な署名、または少なくとも戻り値のデータ型を見ずに 'neighbor'関数を使う方法を示唆するのは難しいです。第3の - あなたがまだ人口が設定されていない座標から何も削除することはできませんので、あなたの説明から、 'parse'が完了した後に各要素に対して' neighbor'を呼び出さなければならないように見えます。 – jwvh

+0

私は同意する、カールの提案は素晴らしかった。私は、空のセルにリストを取り込む方法を考え出しました。私がこの質問を投稿したとき、私はまだそれを理解していなかった。私は質問を更新します。また、 'neighbor'関数のシグネチャを追加します。ありがとう! – Colby

答えて

1

あなたの質問を正しく理解していれば、機能している間に物事を突き詰める(この場合はMapから削除する)のですか?

はい、二つのアプローチがある場合:

  1. は、処理するために、残りの要素とあなたの「可変」データの現在の状態のリストを反復ごとに呼び出された末尾再帰関数を作成しますその同じことが、見え

    @tailrec 
    def process(
        input: List[(Char, Int)], 
        board: Map[Any, Any], 
        resultAccum: List[Result]): List[Result] = input match { 
        case Nil => resultAccum.reverse 
        case (char, pos) :: tail => 
        // do the processing 
        val updatedBoard = board - ??? // create update version of the board 
        val updateResults = ??? :: resultAccum 
        process(tail, updatedBoard, updateResults) 
    } 
    
  2. それとも、foldLeftを使用することができ、短い:

    input.foldLeft((initialBoard, List[Result]())) { 
        case ((board, resultsAccum), (char, pos)) => 
        val updatedBoard = board - ??? // create update version of the board 
        val updateResults = ??? :: resultsAccum 
        (updatedBoard, updateResults) 
    }._2.reverse 
    

    foldLeftの初期状態には、ボードの初期状態と結果の空のリストが含まれています。

関連する問題