【发布时间】:2012-11-05 08:43:43
【问题描述】:
我知道这是一篇很长而且可能令人困惑的帖子……但我真的不知道是什么原因造成的……所以我尽我所能解释。我不知道如何简洁地描述这个问题,这让我很难寻找其他解决方案。
不管怎样,先来一点背景知识。这个程序正在阅读一个二维数组,在所有可能的 8 个方向上寻找一个单词(这个程序基本上是一个自动的单词查找)。
我有一个二维数组,我正在搜索它,寻找一个给定的字符串。为此,我有 3 个循环:
- 第一个循环(循环 x)选择起始 x 坐标
- 第二个循环(循环 y)选择起始 y 坐标
- 最后一个循环(循环 L)从外部循环的 (x,y) 坐标给定的位置开始检查长度为 L 的单词。
但是,在外部循环增加到 1 之前,程序似乎不会进入 L 的循环。因此,我无法开始搜索第 1 列 (x=0) 中的单词,第一个被访问的是第 2 列 (x=1)。 当其他两个循环中的任何一个的值低于 1 时,就好像有一个 if 语句阻止 for 循环运行。更重要的是,这仅发生当我减去数组的索引位置时,而不是当我添加它们时。
为了澄清最后一点,我通过一次向字符串添加字符来搜索单词。因此,当向前阅读时,三个字母的单词 'cat' 将由位置 x 处的字符串 'c' 组成,然后我们在位置 x+1 处将 char 'a' 添加到字符串中,然后在该字符串中添加 char ' t' 来自位置 x+2。这基本上写为 arr[x+L][y],用于向前搜索一个单词。但是,我也想找到倒写的单词。所以为此我有一个循环添加arr [x-L] [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[x-L][y] 因此,对于这个程序,程序从 arr[1][0] 开始读取。
- 对角线搜索 - 向后和向上
x 和 Y 都有这个错误。由于“DiBU+Puzzle[x-L][y-L]”,x=0 和 y=0 都不会进入循环。所以 因此,对于这个程序,程序从 arr[1][1] 开始读取。
编辑:我尝试简单地减去 1(如在 B+Puzzle[x-L-1][y] 中),但这只会导致它从正确的位置开始,但会缩短一列。
TL;DR 除非外部两个循环的值大于 0,否则无法读取三个 for 循环的最里面。但只有当我从所述最里面的 For 循环内的数组索引中减去值时,才会出现此问题。
【问题讨论】:
-
我建议您在调试器中单步调试代码,以了解您的程序真正在做什么。
-
我不使用 IDE...我被教导不要从一个 IDE 开始学习编程,然后即使我知道了基础知识,我也从来没有真正感受到使用它。我可以包含围绕代码的打印语句的输出,这为我提供了一些见解......但我无法在此处正确格式化
-
使用更好的变量名...并遵守标准命名约定。
L大写字母表示迭代器变量,F表示变量,哎哟。 -
IDE 旨在提高您的工作效率和应用程序的质量。您可以通过添加断点来调试您的程序,然后单击
Debug旁边的运行。一旦习惯了 IDE(这确实需要一些时间),您可能想知道为什么要以其他方式使用它。 -
我不知道大写变量如此不受欢迎......因为它值得我通常不使用它们......
标签: java for-loop multidimensional-array char