0

このチェックはまだ失敗しています。テストできるように条件を分割します。cs = "WWWW"、"WXW"、"WWWWWWWWRWWWWWW" の場合は失敗します。

/** 
 * Check to ensure all lines are only composed of walls, 
 * entrance, exit, and space
 */
protected boolean invalidMazeCharacters(CharSequence cs) {

    p = Pattern.compile("^W+R|X|\\s*W+$");
    m = p.matcher(cs);
    if (!m.matches()) {
        return true;
    }
    return false;
}
4

2 に答える 2

2
CharSequence cs = new String(line.toString());

ここでは、配列がどのように見えるかの文字列を作成しています。「[C@333cb1eb」のようなもの

'toString()'を行にドロップすると、一歩近づく可能性があります。

于 2012-03-10T00:22:08.093 に答える
1

角かっこ表記の意味を誤解しているようです[...]文字クラスを作成します。つまり、の任意の文字である1つの文字と正確に一致し...ます。(一致する文字をより細かく制御するための特別な構文がいくつかありますが、それが基本的な考え方です。)たとえば、次のパターンの場合は次のようになります。

^W[W{10,20}R{1}]W$

文字列は正確に3文字の長さである必要があります。最初の文字がW;であること。2番目の文字がa W、a {、a 1、a 0、コンマ、a 2、a }、またはR;であること。そして、3番目の文字は別のものWです。

その場合、実際に書くべきものは次のとおりです。

^W+RW+$

W文字列が1つを除いて完全にsで構成され、文字列がsRで開始および終了することを確認しWます。W(この時点で、文字列の長さが正確に22文字であることをすでに確認しているので、sの数について心配する必要はありません。)


追加するために編集:ちなみに、ユニットテストがあるのは素晴らしいことですが、メソッドのインターフェイスは非常に狭く、文字列を受け取り、一連の検証を実行し、trueまたはfalseを返すだけなので、ユニットテストにはあまり適していません。テスト。ユニットテストで、メソッドがfalse特定の文字列に対して誤って返されることがわかった場合、何がうまくいかなかったかについての情報はほとんどないため、問題を見つけるのにあまり役立ちません。(これはすでに自分で見てきました。)さらに悪いことに、ユニットテストでメソッドが特定の文字列に対して正しく返されることがわかった場合でも、正しい理由で返されることを確認する方法はありません。falsefalse 。したがって、コードが正しいことを確認するのにはあまり役立ちません。これに対処する方法はいくつかあります。

  • 検証ルールごとに個別のメソッドを作成してcheckFileValidLineから、それらの各メソッドを呼び出して行を検証できます。checkFileValidLineそうすれば、それらのメソッドの単体テストを行うことができます(これらのメソッドを呼び出して正しい結果を返すことを確認するための大まかな単体テストに加えて)。(これは私がお勧めするアプローチです。)
  • 現在のメソッドと同じ検証を実行するヘルパーメソッドを作成できますが、有効な文字列と無効な文字列を返す代わりにtrue、有効な文字列と(たとえば)無効な文字列をfalse返すことができます。ユニットテストでは、正確に正しい検証ルールがトリガーされていることを確認できますが、ヘルパーメソッドが返された場合は戻ることができます。null"line.length != 22"checkFileValidLinetruenull
于 2012-03-10T00:17:52.993 に答える