これは非常に長く、おそらく紛らわしい投稿であることはわかっています...しかし、何が原因なのか本当にわかりません...だから、説明するのに最善を尽くしました. 問題を簡潔に説明する方法がわからないため、他の解決策を探すのがかなり難しくなっています。
とにかく、まず背景を少し。このプログラムは、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 ループ内の配列のインデックスから値を減算している場合にのみ発生します。