我编写了一个函数来重新排序矩阵的行和列,发现一个奇怪的输出,我无法弄清楚什么是错误的。 我已经创建了一个函数,只是为了简单说明正在进行的操作(这不是原始功能,而只是为了解问题是什么)。
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]]
出了什么问题?
答案 0 :(得分:1)
问题是res[j]=v;
。在这里,您将维度1数组设置为相同的实例,即res
中的所有元素都引用v
,因此具有相同的内容。
相反,您可能会int[][] res = new int[10][3];
和res[j][i]=i+j;
。
请注意,int[][] res
实际上意味着res
是int[]
数组的数组,即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 = 0
到i < 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;
}