目标: 使用值为 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
最佳答案
我浏览了代码,认为我大致知道为什么会出现问题。直接回答您的三个问题:
打印数组内容的最简单方法:
System.out.println(Arrays.toString(gridA));
要复制数组,您可能应该使用clone()实用程序。
gridA = getNewRow().clone();
在本例中不确定您在问什么。调用函数时会计算数组。如果您正在寻找出了什么问题,我第一次看代码会让我对 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/