0

これは非常に長く、おそらく紛らわしい投稿であることはわかっています...しかし、何が原因なのか本当にわかりません...だから、説明するのに最善を尽くしました. 問題を簡潔に説明する方法がわからないため、他の解決策を探すのがかなり難しくなっています。

とにかく、まず背景を少し。このプログラムは、2D 配列を 8 つの方向すべてで読み取り、単語を探します (このプログラムは基本的に自動化された単語検索です)。

私は 2D 配列を持っていて、特定の文字列を探してそれを検索しています。これを行うには、3 つのループがあります。

  • 最初のループ (x のループ) は、開始の x 座標を選択します。
  • 2 番目のループ (ループ y) は、開始 y 座標を選択します。
  • 最後のループ (ループ L) は、外側のループの (x,y) 座標で指定された位置から始まる長さ L のワードをチェックします。

しかし、プログラムは、外側のループが 1 に増えるまで L のループに入らないようです。このため、1 列目 (x=0) の単語の検索を開始できず、最初にアクセスされるのは列 2 (x=1)。他の 2 つのループのいずれかからの値が 1 未満の場合、 for ループの実行を妨げる if ステートメントがあるかのようです。さらに、これは、配列のインデックス位置を追加するときではなく、減算するときにのみ発生します。

最後の点を明確にするために、文字列に文字を 1 つずつ追加して単語を検索しています。したがって、順方向に読む場合、「cat」という 3 文字の単語は、位置 x の文字列「c」で構成され、その文字列に位置 x+1 の文字「a」を追加し、その文字列に文字「 t' 位置 x+2 から。これは基本的に arr[x+L][y] として書かれ、単語を前方に検索します。ただし、逆に書かれた単語も見つけたいと思っています。そのため、arr [xL] [y] を追加するループがあります。このエラーは、配列内のインデックスから L を減算しているときにのみ発生し、減算された値に対してのみ発生するようです (したがって、[x-1][y] の場合、x=0 はfor ループですが、y=0 は実行します。

(短縮された)コードは次のとおりです。

public void searchPuzzle(String[][] Puzzle){

    //For Each Coordinate X,Y
    for(int x=0; x<Puzzle.length; x++){//For each x position

        for(int y=0; y<Puzzle[x].length; y++){//For each y position

            //RESET or INITAITE strings for searching in all 8 directions
            String F="", B="", U="", D="", DiFU="", DiFD="", DiBU="", DiBD="";

            //SEARCH FORWARD
            for(int L = 0; L < Puzzle.length-x; L++){ //search for word of length L
                F = F+Puzzle[x+L][y];
                //System.out.println(F);
                if(isWord(F)){
                    //System.out.println(F);
                }
            }


            //SEARCH BACK 
            System.out.println("X:" + x + " Y: "+y);
            for(int L = 0; L < x; L++){ //search for word of
                System.out.println("X:" + x + " Y: "+y);
                B = B+Puzzle[x-L][y];
                System.out.println(B);
                if(isWord(B)){
                    //System.out.println(B);
                }
            }
            System.out.println("--");

            //SEARCH DIAGONALLY - BACK & UP
            for(int L = 0; L < smaller(x,y); L++){
                DiBU = DiBU+Puzzle[x-L][y-L];
                if(isWord(DiBU)){
                    //System.out.println(DiBU);
                }
            }    
  • 前方を検索

完全に機能します (F+Puzzle[x+L][y] は加算のみを含むため)。したがって、この場合、プログラムは arr[0][0] で読み取りを開始する必要があります。

  • 戻る

私が言及したエラーがありますが、x 値だけが間違っています。これは、x=0 がループ SEARCH BACK に渡されないことを意味し、その結果、ループは x=1 で開始されます。コードには B+Puzzle[xL][y] があることに注意してください。このため、プログラムは arr[1][0] で読み取りを開始します。

  • 斜めに検索 - BACK & UP

x と Y の両方でこのエラーが発生します。「DiBU+Puzzle[xL][yL]」のため、x=0 と y=0 の両方がループに入りません。というわけで、これについては、プログラムは arr[1][1] で読み取りを開始します。

編集:単純に 1 を減算しようとしました (B+Puzzle[xL-1][y] のように) が、これにより、正しい場所で開始されますが、1 つの列が短くなります。

TL;DR 外側の 2 つのループの値が 0 を超えない限り、3 つの for ループの最も内側を読み取ることはできません。ただし、この問題は、最も内側の For ループ内の配列のインデックスから値を減算している場合にのみ発生します。

4

2 に答える 2

1

少なくともすべてが機能するようになるまでは、前方検索と後方検索を分離する方が簡単だと思います。一度に 1 つのことを行い、慎重に行います。

x がゼロの場合に 2 番目のループの反復を行わない理由は、ループ条件にあります。

  for(int L = 0; L < x; L++)

L が 0 未満になることはありません。したがって、x が 0 の場合、L < x という条件が満たされることはなく、ループの反復はゼロになります。

y が 0 で x が 2 であるとします。要素 [2][0]、[1][0]、および [0][0] は、3 文字の単語である可能性があります。L=0 と L=1 の場合、反復は 2 回だけ行います。

両方の問題は、条件を L <= x に変更してもう一度反復することで解決されます。

ループ条件について考えることが非常に重要です。多くの単純なケースでは、「<」テストが適切ですが、常にそうとは限りません。この場合、 L==x は、必要な配列の要素 0 を調べることになります。

于 2012-11-05T09:52:32.700 に答える
0

私は論理的な問題があると思います:

       //SEARCH BACK 
        for(int L = 0; L < x; L++){ //search for word of
            B = B+Puzzle[x-L][y];
            //System.out.println(B);
            if(isWord(B)){
                //System.out.println(B);
            }
        }

単語CATがマトリックスの先頭に書かTACれている場合、それは見つかりません。多分あなたはしたいです:

       //SEARCH BACK 
        for(int L = Puzzle.length-x - 1; L >=0 ; L--){ 
            B = B+Puzzle[L-x][y];
            //System.out.println(B);
            if(isWord(B)){
                //System.out.println(B);
            }
        }

それで、なぜあなたは逆に検索するのですか?前方に検索するたびに、反対側の単語を連結することができます。つまり:

       String forwardword;
       String backwardword; 
       for(int L = 0; L < Puzzle.length-x; L++){ //search for word of length L
            forwardword = forwardword +Puzzle[x+L][y];
            backwardword = Puzzle[x+L][y] + backwardword; // <<HERE

            if(isWord(forwardword)){
                //System.out.println(forwardword);
            }
            if(isWord(backwardword)){
                //System.out.println(backwardword);
            }                

        }
于 2012-11-05T09:03:28.850 に答える