Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';在java中,我在多维字符数组中查找字符串,但我的搜索在不同的单词对应不同的字符后停止。为什么?_Java_Loops_Multidimensional Array_Return_Traversal - Fatal编程技术网

I';在java中,我在多维字符数组中查找字符串,但我的搜索在不同的单词对应不同的字符后停止。为什么?

I';在java中,我在多维字符数组中查找字符串,但我的搜索在不同的单词对应不同的字符后停止。为什么?,java,loops,multidimensional-array,return,traversal,Java,Loops,Multidimensional Array,Return,Traversal,所以我在java中有一个多维数组,它包含一个字符网格。我正在尝试将字符串与网格中的字符相匹配。到目前为止,我已经实现了从左到右、从右到左、从上到下和从下到上的搜索。他们工作,但不是所有的时间 我遇到的问题是,比如说,我在从左到右搜索网格中的字符串“ALGOS”。它找到一个A,然后找到另一个A,然后找到一个L,然后停止。它应该找到A,然后是L,G,O,S。我得到的错误如下: A Found at: [0, 0] A Found at: [1, 4] L Found at: [1, 5] Excep

所以我在java中有一个多维数组,它包含一个字符网格。我正在尝试将字符串与网格中的字符相匹配。到目前为止,我已经实现了从左到右、从右到左、从上到下和从下到上的搜索。他们工作,但不是所有的时间

我遇到的问题是,比如说,我在从左到右搜索网格中的字符串“ALGOS”。它找到一个A,然后找到另一个A,然后找到一个L,然后停止。它应该找到A,然后是L,G,O,S。我得到的错误如下:

A Found at: [0, 0]
A Found at: [1, 4]
L Found at: [1, 5]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
  at WordFind00.findWord(WordFind00.java:59)
  at WordFind00.main(WordFind00.java:45)
这是我的代码-可能出了什么问题? 它的一部分被注释掉,用于测试每个方向

          public static String findWord(char[][]board, String word) {

            for (int row = 0; row < board.length; row++) {
                for (int col = 0; col < board[row].length; col++) {

                    if (board[row][col] == word.charAt(0)) {

                        // search to the right
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row][col+letters]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters}));
                            } 
                        } // end search to the right

                        /*// search to the left
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row][col-letters]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col-letters}));
                            }
                        } // end search to the left 

                        // search down
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row+letters][col]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row+letters,col}));
                            }
                        } // end search down 

                        // search up
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row-letters][col]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row-letters,col}));
                            }
                        } // end search down */

                    }
                }
            }
            return null;
        }
公共静态字符串findWord(char[][]板,字符串字){
对于(int row=0;row
如果有人想测试它: WordFind00.java:
input.dat:

您没有检查数组标记的范围,例如

if (word.charAt(letters) == board[row][col-letters]) {
如果
col letters
小于
0
,这将引发
ArrayIndexOutOfBoundsException
,这适用于您的每个检查

String test = new String(board[row], col, word.length());
if (test.equals(word)) {

    System.out.println("Found [" + word + "] @ " + row + "x" + col);

}
你可以做一些像

if (col - word.length() >= 0) {
    for (int letters = 0; letters < word.length(); letters++) {
        if (word.charAt(letters) == board[row][col-letters]) {
            System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters}));
        } 
    } // end search to the right
}
if (col + word.length() <= board[row].length) {

    int letters = 0;
    while (letters < word.length() && word.charAt(letters) == board[row][col + letters]) {
        letters++;
    }

    if (letters == word.length()) {
        System.out.println("Found [" + word + "] @ " + row + "x" + col);
    }
}
或者,如果必须执行循环,可以执行以下操作

if (col - word.length() >= 0) {
    for (int letters = 0; letters < word.length(); letters++) {
        if (word.charAt(letters) == board[row][col-letters]) {
            System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters}));
        } 
    } // end search to the right
}
if (col + word.length() <= board[row].length) {

    int letters = 0;
    while (letters < word.length() && word.charAt(letters) == board[row][col + letters]) {
        letters++;
    }

    if (letters == word.length()) {
        System.out.println("Found [" + word + "] @ " + row + "x" + col);
    }
}

if(col+word.length()首先,您的错误是因为您没有检查索引。要解决这个问题,您需要做的就是检查单词不会沿着当前方向超过数组的长度

          public static String findWord(char[][]board, String word) {

            for (int row = 0; row < board.length; row++) {
                for (int col = 0; col < board[row].length; col++) {

                    if (board[row][col] == word.charAt(0)) {

                        // search to the right
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row][col+letters]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col+letters}));
                            } 
                        } // end search to the right

                        /*// search to the left
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row][col-letters]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row,col-letters}));
                            }
                        } // end search to the left 

                        // search down
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row+letters][col]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row+letters,col}));
                            }
                        } // end search down 

                        // search up
                        for (int letters = 0; letters < word.length(); letters++) {
                            if (word.charAt(letters) == board[row-letters][col]) {
                                System.out.println(word.charAt(letters) + " Found at: " + Arrays.toString(new int[] {row-letters,col}));
                            }
                        } // end search down */

                    }
                }
            }
            return null;
        }
其次,您没有exit语句。因此,您将继续循环,直到遍历整个电路板。您可以尝试以下操作:

//If we can't fit the word in, don't bother trying
if(col - word.length() >= 0) 
{
    boolean foundWord = true;
    for (int letters = 0; letters < word.length(); letters++)
    {
       //Stop trying as soon as we find a character that doesn't fit
       //Search to the right
       if (word.charAt(letters) != board[row][col+letters])
       {
           foundWord = false;
           break;
       }
    }
    //We can only get here if we've looped through the entire word and found a match for all of it.
    if(foundWord)
    {
        //Yay! I'm not sure about your return value though. 
        return "foundString!";
    }
}
//如果我们不能把这个词放进去,不要费心去尝试
if(col-word.length()>=0)
{
布尔值foundWord=true;
用于(int字母=0;字母

最后,是一个小小的吹毛求疵,尽管这对一个小例子来说并不重要,而且这样看和理解起来更清晰……你可能不想在每个方向上都使用循环这个词。你可以在循环中的每个方向上进行搜索。

考虑提供一个例子来说明你的问题。这将减少混淆n和更好responses@Peter是的,是的。我已经被这个问题困扰了一段时间,我无法解决它。任何帮助都将不胜感激。
if(word.charAt(字母)==board[row][col letters]){
-如果
col
0
(或
col letters<0
),会发生什么[行+字母][col])
-如果
行+字母>=board.length
,会发生什么?好的,所以我在中添加了这个-谢谢。但是,现在我得到了一个不同的输出。当我搜索“ALGO”时我得到A,A,L,A,O,A,L,G,O,A,L,G,O。为什么我不能得到A,L,G,O?可能是因为一旦你满意你找到了你要找的单词,你就没有退出循环的条件了……是的,这是真的,但即使在我得到字母之前,我也不应该。给我一个可运行的例子,这样我就可以实际测试它;)好的,这是完整的WordFind00.java程序,这是input.dat文件。您需要使用input.dat文件加载网格,但要测试搜索字符串,只需更改findWord方法调用中传递的字符串。