1

指定された数値の配列内のすべての値をシフトしようとしています。たとえば、1 シフトの配列 {1,2,3,4,5} は {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;正しいですよね?デバッガーでさえ、正しく変更されたと言っています...では、最初の実装ではテストが失敗するのに、2番目の実装では失敗しないのはなぜですか?

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 に答える