I';在java中,我在多维字符数组中查找字符串,但我的搜索在不同的单词对应不同的字符后停止。为什么?
所以我在java中有一个多维数组,它包含一个字符网格。我正在尝试将字符串与网格中的字符相匹配。到目前为止,我已经实现了从左到右、从右到左、从上到下和从下到上的搜索。他们工作,但不是所有的时间 我遇到的问题是,比如说,我在从左到右搜索网格中的字符串“ALGOS”。它找到一个A,然后找到另一个A,然后找到一个L,然后停止。它应该找到A,然后是L,G,O,S。我得到的错误如下: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
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方法调用中传递的字符串。