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