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

Java 如何:(方法数组)变为被方法修改的原始数组,原始数组变为(方法数组),java,arrays,Java,Arrays,目标: 使用值为true或false的布尔数组网格绘制自动机。(真=打印(*),假=打印(“”)。 这必须通过多次打印相同的布尔数组(gridA)来完成,但每次都给它一个单独计算的布尔数组gridNext的值。gridNext的值是通过getNewRow方法基于原始数组(gridA)计算的 问题: 使用下面给出的代码,只计算前两个数组。 之后,每个索引的值都将填充为false。 我相信问题出在getNewRow方法(第147-154行)或newCellValueByA方法(第119-136行)的

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

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

问题: 有人能确切地解释一下你是怎么做的吗 1.打印数组(gridA) 2.然后给原始数组(gridA)另一个数组(gridNext)的值 3.当通过方法(getNewRow)基于原始数组(gridA)计算另一个数组(gridNext)时

回顾: 我一直在检查这些方法,但发现错误时遇到了困难。我特别惊讶的是,运行代码会打印出两行,但其余的都是100%的错误。我想我应该看看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
公共级蜂窝织炎{
扫描仪=新的扫描仪(System.in);
字符串网格类型;
布尔网格;
布尔[]网格;
布尔[]下一步;
int L;//始终为正。表示单元格行的长度(不计算可能添加到实现中的额外边框单元格)
int G;//始终为正。表示应显示的代数
void execute(){
readGeneral();
/*稍后删除*/
System.out.println(“执行的输出”+gridA[0]+“执行的输出”+gridB[0]);
readInitialConfiguration();
对于(int n=0;n
这是用来画自动机的方法。我不认为问题在这里

    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
void draw(){//绘制自动机的当前状态(即输出行上的单元格值)
对于(int i=0;i
这些方法计算方法。我认为这里(或执行文件中)有问题

boolean newCellValueByA(int k){//根据自动机A返回下一时间步的单元号k的值
if(gridA[k]==true){
if(gridA[k-1]==true&&gridA[k+1]==true | | gridA[k-1]==false&&gridA[k+1]==false){
返回false;
}//如果结束
否则{
返回true;
}//结束其他
}//如果结束
否则{
if(gridA[k-1]==false&&gridA[k+1]==false){
返回false;
}//如果结束
否则{
返回true;
}//结束其他
}//结束其他
}//结束方法
布尔[]getNewRow(){//计算并返回下一时间步的新行单元格。此方法可能会创建一个新数组
fill(gridNext,false);
对于(int m=1;m
我仔细阅读了代码,认为我大致了解了您出现问题的原因。要直接回答您的三个问题:

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

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

  • 不确定您在问什么。数组是在调用函数时计算的。如果您在查找出错的地方,我第一次查看代码时会感到困惑,因为您从1迭代到L-1,而不是从0迭代到L-1。这意味着您的gridA[0]永远不会变为true

  • 然而,为什么在两次迭代后所有内容都会被吸引到false,这是因为(使用长度为10的数组作为示例):

    首先,数组被设置为all true(让T=true,F=False)

    tttttttt

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

    TFFFFFFFF?

    对于For循环的最后一个循环,m=9,这应该给出我所能知道的索引越界,因为你把最高的索引(m)传递给函数newCellValueByA,然后它引用下一个索引(k+1)。超过这个,对我来说有点神秘,因为我不知道你怎么会不会出错


    希望问题1的答案能帮助您更好地了解数组在不同点的位置,从而了解发生了什么。

    这是一大堆代码,缩进很难阅读,很多
        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