我试图在java中编写一个方法,允许我交换double类型的2d数组的行。当我在2d数组上使用它时,我的代码工作正常,但是当应用于double时它不起作用。我错过了关于双数据类型的基本信息吗?非常感谢任何见解。
// swapRows
// double[][] Integer -> double[][]
public static double[][] swapRows(double[][] a, int i)
{
double[] temp = a[i];
for(; i < a.length - 1; i++)
a[i] = a[i+1];
a[a.length - 1] = temp;
return a;
}
//带有新的2d数组的版本2
public static double[][] swapRows(double[][] a, int i)
{
double[][] b = new double[a.length][a[0].length];
double[] temp = a[i];
for(int k = 0; k < i;k++)
b[k] = a[k];
for(; i < a.length - 1; i++)
b[i] = a[i+1];
b[b.length - 1] = temp;
return b;
}
//请注意,行不只是交换,指定的行i被发送到数组的底部,而每隔一行都会向上移动 //对于2d数组:
{ {3, 5, 6},
{2, 1, 1},
{9, 0, 4} }
//我希望当i = 0时,该方法返回2d数组:
{ {2, 1, 1},
{9, 0, 4},
{3, 5, 6} }
//而是我得到:
{ {0.0, -29.999996, -38.571428},
{18.999997, 0.0, 0.999999},
{18.0, 29.999996, 36.0} }
//当我使用int而不是double时,我得到了预期的数组
答案 0 :(得分:1)
由于代码是正确的恕我直言,2D数组必须已损坏(不太可能,两行中相同的double[]
行对象)或更可能你正在改变传递的数组并返回它的事实可能表明错误地处理了结果。
double[][] a = ...
double[][] b = swapRows(a, i);
// a == b
创建已更改副本的版本:
public static double[][] swapRows(double[][] a, int i) {
double[][] result = new double[a.length][];
for (int j = 0; j < a.lnength; ++j) {
result[j] = Arrays.copyOf(a[j], a[j].length);
}
double[] temp = result[i];
for(; i < result.length - 1; i++) {
result[i] = result[i+1];
}
result[result.length - 1] = temp;
return result;
}
double[][] a = { { 1.0, 2.0 }, { 3.0, 4.0 } };
double[][] b = swapRows(a, 0);
assert b[0][0] == 3.0 && b[0][1] == 4.0 && b[1][0] == 1.0 && b[1][1] == 2.0;
System.out.println("result = " + Arrays.deepToString(result));
答案 1 :(得分:0)
我已经确定了问题所在。我的main函数中有其他测试行,它们在传递给swapRows方法之前修改了数组的值。谢谢你的帮助。