【问题标题】:Java gets me strange output matrixJava让我奇怪的输出矩阵
【发布时间】:2017-03-09 17:37:08
【问题描述】:

我编写了一个函数来重新排序矩阵的行和列,并发现了一个奇怪的输出,我不知道出了什么问题。 我制作了一个函数,只是为了简单地说明发生了什么(这不是原始函数,只是为了了解问题所在)。

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]]

怎么了??

【问题讨论】:

  • 什么是样本输入和预期/实际输出?我不明白你的描述。

标签: java algorithm matrix vector


【解决方案1】:

问题是res[j]=v;。在这里,您将维度 1 数组设置为 same 实例,即 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 &lt; res[j].length)。

【讨论】:

  • 我知道,如果我这样做,它会给我应有的东西,但在我的情况下,我会有不同长度的向量,我想像这样“插入”它们。
  • @BernardoBraga 在这种情况下您需要动态初始化 res[j] ,我会相应地更新答案。
  • 这会起作用,但为什么我不能做 res[j]=v?我已经在 fors 内打印了,一切正常,我只是对这个无意义的输出感到好奇
  • @BernardoBraga 你可以res[j]=v,只要你在每次迭代中重新分配/重新创建v。这样做只是在您发布的代码中是多余的,您的实际代码可能是另一回事。
【解决方案2】:

您必须在第一个 for 循环内移动 v 向量的创建。否则 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2016-06-20
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多