目标: 使用值为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
答案 0 :(得分:1)
我仔细阅读了代码并认为我一般都知道你为什么会遇到问题。直接回答你的三个问题:
打印数组内容的最简单方法:System.out.println(Arrays.toString(gridA));
要复制数组,您应该使用clone()实用程序。在这种情况下gridA = getNewRow().clone();
不确定你在问什么。调用函数时计算数组。如果您正在寻找出错的地方,我首先看一下代码会让我感到困惑的是gridA [0]如何变化,因为您从1迭代到L-1而不是0到L-1。这应该意味着你的gridA [0]永远不会改变为真。
然而,为什么在两次迭代之后所有东西都会因为这个而变得错误(使用长度为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的答案可以帮助你弄清楚阵列在不同的点上是什么,以找出更好的东西。