我正在用Java编写一个程序,在其中我可以使用Warshall的算法找到关系的传递闭包。虽然我理解算法我是java的新手,但我遇到了一些奇怪的数组行为。
我正在经历一些不同的行为。
一个是(偶尔)当我在一个数组中更改元素的值时,另一个数组被修改。在没有分离我的声明和初始化之前我犯了错误,所以我很确定现在不是这样。
其次,有时如果我评论/取消注释System.out.println()
我的所有二维数组都包含值'0',但如果我还原注释/取消注释,我得到的值不是零。我打印到屏幕上的内容大多数时候都是一个硬编码的字符串,所以我认为它与天气的评论是否有关(IE:不是函数调用)。
编辑(忘记添加代码):
类别:
package warshall;
import java.util.ArrayList;
public class Warshall {
private int[][][] relation;
public void setRelation(int[][][] relation){
this.relation = relation;
}
public void setRelationSet(int i, int j, int k, int value){
this.relation[i][j][k] = value;
}
public int[][][] getRelation(){
return this.relation;
}
public int getRelationSet(int i, int j, int k){
return this.relation[i][j][k];
}
private int size;
public void setSize(int size){
this.size = size;
}
public int getSize(){
return this.size;
}
private int[][] tempArray;
public void process() {
for(int k = 1; k < this.size; k++){
tempArray = new int[this.size][this.size];
for(int i = 0; i < this.size; i++){
for(int j = 0; j < this.size; j++){
for(int node = 0; node < k; node++){
if(this.relation[i][j][k-1] == 1 || (this.relation[i][node][k-1] == 1 && this.relation[node][j][k-1] == 1)){
System.out.println("i = "+i+": j = "+j+": k = "+k+": node = "+node);
tempArray[i][j] = 1;
}
}
}
}
System.out.println("Kth -1:");
this.outputRelationSet(k-1);
System.out.println("Kth: ");
for(int m = 0; m < this.size; m++){
for(int n = 0; n < this.size; n++){
this.relation[m][n][k] = tempArray[m][n];
//System.out.println(tempArray[m][n]);
if(n == this.size-1){
System.out.println("'"+tempArray[m][n]+"'");
}else{
System.out.print("'"+tempArray[m][n]+"'");
}
}
}
}
}
public void outputRelationSet(int set){
for (int i=0; i < this.size; i++){
for(int j=0; j < this.size; j++){
if(j == this.size-1){
System.out.println("'"+this.relation[i][j][set]+"'");
}else{
System.out.print("'"+this.relation[i][j][set]+"'");
}
}
}
}
}
主要
package warshall;
import java.util.Arrays;
public class test {
public static void main(String[] args) {
int size = 4;
int[][][] theArray = new int[size][size][size];
for (int k=0; k < size; k++){
for (int i=0; i < size; i++){
for(int j=0; j < size; j++){
theArray[i][j][k] = 0;
}
}
}
theArray[0][3][0] = 1;
theArray[1][2][0] = 1;
theArray[2][0][0] = 1;
theArray[3][1][0] = 1;
Warshall thisWarshall = new Warshall();
thisWarshall.setSize(size);
thisWarshall.setRelation(theArray);
thisWarshall.outputRelationSet(0);
System.out.println();
thisWarshall.process();
System.out.println("Final: ");
thisWarshall.outputRelationSet(3);
}
}
编辑2:
详述第一项。在Warshall.process()方法中,当我点击此行tempArray[i][j] = 1;
时,它似乎也会更改Warshall.relation[i][j][k]
数组的关联值。我想要做的是使用tempArray[][]
来收集结果,而不修改Warshall.relation[][][]
数组,这就是我的计算基础。然后,在循环遍历所有顶点之后,我将tempArray[][]
与Warshall.relation[][][k]
同步。但是因为Warshall.relation[i][j][k]
被修改,因为我遍历顶点,我的结果变得歪斜。
详述第二项。我删除了用于调试的大部分System.out.println()
,所以发布的代码我不能重新解决这个问题。我更多地想知道在Java中是否存在这种行为的常见原因。当我回到家时,我将获得一部分代码,重新创建它并发布另一个特定于该问题的问题。对于今后遇到的任何人,我将从这个问题中添加一个链接。
答案 0 :(得分:0)
关于你的第二个问题。
无需使用int array
初始化zero
的每个元素,因为java
默认情况下int array
的每个元素都是zero
。
所以,如果你这样做
int a[] = new Integer[5];// whether it is 1D , 2D or 3D
System.out.println(a[2]);
然后会打印0