1

我正在尝试使用给定数字移动数组中的所有值。例如数组 {1,2,3,4,5} 具有 1 个移位必须变为 {5,1,2,3,4}。这是用 JUnit 测试的。

JUnit 测试是这样的:

    @Test    
    public void shift1(){
        double[] row = {1.0,2.0,3.0,4.0,5.0};
        int amount= 1;
        ArrayOperations.shift(row, amount);
        Assert.assertEquals(5.0, row [0]);
        Assert.assertEquals(1.0, row [1]);
        Assert.assertEquals(2.0, row [2]);
        Assert.assertEquals(3.0, row [3]);
        Assert.assertEquals(4.0, row [4]);      
    }

我的方法是这样的:

public static void shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }

    row= newRow;
}

现在这个测试因任何未知原因而失败。我在编程课上遇到了这个问题,甚至我的老师也没有找到原因。当我调试它时,数组被正确修改,导致 {5,1,2,3,4}。但是JUnit失败了……但是这段代码可以工作

public static void shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }

    for (int i = 0; i < newRow.length; i++) {
        row[i] = newRow[i];            
    }
}

有谁知道为什么?row= newRow;是正确的吗?甚至调试器都说它已正确更改...那么为什么第一个实现的测试失败,而第二个实现却没有呢?

4

2 回答 2

5

现在这个测试因任何未知原因而失败

不,它不起作用,因为您对 Java 中参数的工作方式感到困惑。这与 JUnit 或数组无关。它与参数有关。

row= newRow;是正确的吗?

不,这不对。这只是设置参数的值,它只是方法中的一个局部变量。它对调用者的变量没有任何作用,这是您所期望的。

一个更简单的例子:

String x = "foo";
method(x);
System.out.println(x); // Still prints foo...

...
static void method(String p) {
    p = "bar";
}

Java 中的所有参数都是按值传递的……尽管您需要了解对于引用类型,这些值是引用(而不是对象)。

我建议您找到一本好的 Java 教程或书籍,并阅读更多关于参数传递的内容。

于 2012-12-04T19:27:18.473 回答
0

在 java 中,数组作为值传递,因此在内部完成的任何更改都不会反映在 Test 中rowshiftshift1。您需要将更新后的数组作为返回值并将其分配回原始数组:

  public static double[] shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }
    return newRow;
  }

  @Test
  public void shift1(){
        double[] row = {1.0,2.0,3.0,4.0,5.0};
        int amount= 1;
        row = ArrayOperations.shift(row, amount);
        Assert.assertEquals(5.0, row [0]);
        Assert.assertEquals(1.0, row [1]);
        Assert.assertEquals(2.0, row [2]);
        Assert.assertEquals(3.0, row [3]);
        Assert.assertEquals(4.0, row [4]);      
    }
于 2012-12-04T19:37:48.257 回答