Java让我奇怪的输出矩阵

时间:2017-03-09 17:37:08

标签: java algorithm matrix vector

我编写了一个函数来重新排序矩阵的行和列,发现一个奇怪的输出,我无法弄清楚什么是错误的。 我已经创建了一个函数,只是为了简单说明正在进行的操作(这不是原始功能,而只是为了解问题是什么)。

public static int[][] hey(){
        int[][] res = new int[10][];
        int[] v = new int[3];
        for(int j=0;j<10;j++){
            for(int i=0;i<3;i++){
                v[i]=i+j;
            }
            res[j]=v;
        }
        return res;
    }

并且输出是一个矩阵,其中每个向量是它应返回的最后一行[[9,10,11],[9,10,11],...,[9,10,11]]它应该返回[[0,1,2],[1,2,3],[2,3,4],...,[9,10,11]]

出了什么问题?

2 个答案:

答案 0 :(得分:1)

问题是res[j]=v;。在这里,您将维度1数组设置为相同的实例,即res中的所有元素都引用v,因此具有相同的内容。

相反,您可能会int[][] res = new int[10][3];res[j][i]=i+j;

请注意,int[][] res实际上意味着resint[]数组的数组,即res[x]指的是Object(所有数组都是对象)。这意味着res[x]实际上包含引用而不是值,因此res[j] = v更新引用指向v(您永远不会更改)。

<强>更新

根据您的评论,尺寸2的长度是变化的。在这种情况下,您需要初始化外部循环中的元素:

for(int j=0;j<10;j++){
  res[j] = new int[variable_length];
}

然后你仍然可以res[j][i](当然你会迭代i = 0i < res[j].length)。

答案 1 :(得分:0)

你必须在第一个for循环中移动v vector的创建。否则res数组/矩阵的每一行将引用相同的v向量,该向量将包含最后3个值。

public static int[][] hey(){
        int[][] res = new int[10][];

        for(int j=0;j<10;j++){
            int[] v = new int[3];
            for(int i=0;i<3;i++){
                v[i]=i+j;
            }
            res[j]=v;
        }
        return res;
    }