Java - 为什么我的数组包含不正确的数据

时间:2013-12-10 06:44:46

标签: java arrays

我正在用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中是否存在这种行为的常见原因。当我回到家时,我将获得一部分代码,重新创建它并发布另一个特定于该问题的问题。对于今后遇到的任何人,我将从这个问题中添加一个链接。

1 个答案:

答案 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