【问题标题】:Inner of 3 for loops won't run unless value from outer loops is non-zero, but only when subtracting inside the innermost loop除非外部循环的值非零,否则 3 个 for 循环的内部不会运行,但只有在最里面的循环内减去时才会运行
【发布时间】: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


【解决方案1】:

我认为将前向搜索和后向搜索分开会更简单,至少在您完成所有工作之前是这样。一次只做一件事,并且小心翼翼地去做。

如果 x 为零,则不进行第二个循环的任何迭代的原因在于循环条件:

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

L 永远不会小于 0,因此如果 x 为 0,则永远不会满足条件 L

假设 y 为 0,x 为 2。元素 [2][0]、[1][0] 和 [0][0] 可以是三个字母的单词。对于 L=0 和 L=1,您将只进行两次迭代。

这两个问题都可以通过将条件更改为 L

考虑循环条件非常非常重要。在许多简单的情况下,“

【讨论】:

  • 这很明显。我很抱歉(对于愚蠢的问题,以及迟到 2 周的回复)。我猜这就是你在凌晨 3 点在这里发布问题所得到的。感谢您的帮助。
【解决方案2】:

我认为有一个逻辑问题:

       //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);
            }                

        }

【讨论】:

  • 嗯...似乎应该可以工作。但是,当我尝试它时,有些单词并没有正确显示(即,它倾向于无缘无故地重复某些字母)。尽管您可能是正确的,因为您的方法效果更好......我仍然对 for 循环不会仅仅因为它位于其中的循环的值以及减法位如何进入这一点而感到困扰。 ..我想不出一个合乎逻辑的原因......这真的让我很烦恼。
  • 等等,你说的是哪个选项??
  • int L = 0; L &lt; x。如果x = 0 则不会执行。这表明这段代码是错误的。
  • 哇。好的。是的,我很愚蠢。这些都应该小于或等于。这是您在凌晨 3 点在此处发布的信息。多谢你们!抱歉,我的问题最终变得如此愚蠢。
猜你喜欢
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多