如何:(方法数组)成为原始方法修改的数组,原始数组变为(方法数组)

时间:2015-09-18 14:56:28

标签: java arrays

目标: 使用值为true或false的布尔数组gridA绘制自动机。 (true = print(*),false = print(“”)。 这必须通过多次打印相同的布尔数组(gridA)来完成,但每次都给它一个单独计算的布尔数组gridNext的值。 gridNext的值是通过方法getNewRow基于原始Array(gridA)计算的。

问题: 使用下面给出的代码,只计算前两个数组。 之后,每个索引都填充了false值。 我认为问题出在getNewRow方法(第147-154行)或newCellValueByA方法(119-136)中,但我无法找到错误。

问题: 有人可以解释你究竟是怎样的 1.打印一个数组(gridA) 2.然后给原始数组(gridA)另一个数组的值(gridNext) 3.当一个方法(getNewRow)基于原始数组(gridA)计算其他数组(gridNext)

回顾: 我一直在寻找方法,但我找不到错误。我特别惊讶的是,运行代码会打印出两行,但其余的则为100%false。我想我应该看看gridA是否正确给出了gridNext的值,但我找不到问题。

这是在main方法

中调用的类声明和方法(execute)
  public class Cellulitis{
    Scanner scanner = new Scanner(System.in);
    String gridType;
    boolean [] gridA;
    boolean [] gridB;
    boolean [] gridNext;
    int L; //Always positive. Represents the length of the row of cells (not counting the extra border cells that may be added into implementation)
    int G; //Always positive. Represents the number of generations that should be displayed

    void execute(){ 
      readGeneral();
      /*remove later*/    
      System.out.println("output from execute "+gridA[0]+" output from execute "+gridB[0]);
      readInitialConfiguration();

      for(int n = 0; n < G; n++){ //draw generations
          draw();
          gridA = getNewRow();

          /* This was test material, and will be removed if material above is functional
          for(int m = 1; m < L-1; m++){ //determine each individual cell-value  
              gridA[m] = newCellValueByA(m);
           }//end for-loop
           */

      }//end for-loop

    }//end method

这是用于绘制自动机的方法。我不认为问题会在这里。

    void draw(){ //draws the current state of the automaton (i.e. the values of cells, on one line of output)
        for( int i = 0; i < L; i++){
            if(gridA[i] == true){
                System.out.print("*");
            }//end if
            else{
                System.out.print(" ");
            }//end else
        }//end for
        System.out.println();

    }//end method

这些方法计算方法。我希望在这里(或在执行文件中)存在问题

    boolean newCellValueByA(int k){ //returns the value of cell number k for the next time step, according to automaton A
        if(gridA[k] == true){
            if(gridA[k-1] == true && gridA[k+1] == true || gridA[k-1] == false && gridA[k+1] == false){
                return false;
            }//end if
            else{
                return true;
            }//end else
        }//end if
        else{
            if(gridA[k-1] == false && gridA[k+1] == false){
                return false;
            }//end if
            else{
                return true;
            }//end else
        }//end else
    }//end method

    boolean[] getNewRow(){ //calculates and returns a new row of cells for the next time step. This method will probably create a new array
        java.util.Arrays.fill(gridNext,false);
        for(int m = 1; m < L-1; m++){ //determine each individual cell-value  
            gridNext[m] = newCellValueByA(m);
        }//end for-loop

        return gridNext;
    }//end method

1 个答案:

答案 0 :(得分:1)

我仔细阅读了代码并认为我一般都知道你为什么会遇到问题。直接回答你的三个问题:

  1. 打印数组内容的最简单方法:System.out.println(Arrays.toString(gridA));

  2. 要复制数组,您应该使用clone()实用程序。在这种情况下gridA = getNewRow().clone();

  3. 不确定你在问什么。调用函数时计算数组。如果您正在寻找出错的地方,我首先看一下代码会让我感到困惑的是gridA [0]如何变化,因为您从1迭代到L-1而不是0到L-1。这应该意味着你的gridA [0]永远不会改变为真。

  4. 然而,为什么在两次迭代之后所有东西都会因为这个而变得错误(使用长度为10的数组作为例子):

    首先,您的数组设置为全为真(让T = True,F = False)

    TTTTTTTTTT

    然后,对于每个索引1到9,检查它的周围值。如果周围的值相同,则将其设置为False。由于gridA是您要比较的,并且它没有更新,直到nextRow计算完成,除了索引0(m的外边界)之外,所有内容都设置为false。每个值1到8都会发生这种情况:

    TFFFFFFFF?

    对于for循环的最后一个循环,m = 9,就我所知,这应该给索引超出范围,因为你将最高索引(m)传递给函数newCellValueByA然后引用下一个索引第(k + 1)。过去这个对我来说有点神秘,因为我不知道你怎么不出错。

    希望你的问题1的答案可以帮助你弄清楚阵列在不同的点上是什么,以找出更好的东西。