java - 如何将: (method Array) becomes original Array modified by method,和原来的Array变成(方法Array)

标签 java arrays

目标: 使用值为 true 或 false 的 boolean 数组 gridA 绘制自动机。 (真=打印(*),假=打印(“”)。 这必须通过多次打印相同的 boolean 数组 (gridA) 来完成,但每次都为其提供单独计算的 boolean 数组 gridNext 的值。 gridNext的值是根据原始Array(gridA)通过getNewRow方法计算出来的。

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

问题: 有人能准确解释一下你是如何 1. 打印一个数组(gridA) 2.然后将另一个数组(gridNext)的值赋予原始数组(gridA) 3.当通过方法(getNewRow)基于原始数组(gridA)计算另一个数组(gridNext)时

审核: 我一直在研究这些方法,但很难找到错误。我特别惊讶的是,运行代码会打印两行,但其余行则 100% 错误。我想我应该看看 gridA 是否正确给出了 gridNext 的值,但我在那里找不到问题。

这是在主方法中调用的类声明和方法(执行)

  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. 打印数组内容的最简单方法:System.out.println(Arrays.toString(gridA));

  2. 要复制数组,您可能应该使用clone()实用程序。 gridA = getNewRow().clone(); 在本例中

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

但是,为什么两次迭代后一切都趋向于 false 是因为这个(以长度为 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 的答案可以帮助您弄清楚数组在各个点上的含义,以便更好地了解发生了什么。

关于java - 如何将: (method Array) becomes original Array modified by method,和原来的Array变成(方法Array),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655073/

相关文章:

java - 计算字符串中的空格数

java - 使用 JUnit 运行 Spring 时出现问题

java - bash 脚本 : search Java STDOUT for a variable

java - 按键和按钮兼容性 Java

java - 如何获取用户输入的每个数字作为字符串中的一组数字,每个数字用空格分隔?

c - 当我只能定义一个可变长度数组时,为什么要使用 malloc()?

java - 如何在eclipse中管理多个包?

java - 如何检查数组中的所有值是否都具有特定值?

mysql_fetch_array (MYSQL)

c++ - 如何将 N 个函数指针数组初始化为从 0..N-1 索引的函数模板?