0

問題があります。extendedEuclid メソッドでプリミティブ long 型を参照として渡すにはどうすればよいですか? Javaではできないことがわかりました。他の解決策はありますか?

パラメーター long a は参照渡しする必要があります。以下のコードは次のとおりです。

public long extendedEuclid(long a, long b) //a have to be passed as a reference
{
    long x = 0;
    long y = 1;
    long lx = 1;
    long ly = 0;
    long temp_a;
    List quotient = new ArrayList<>();

    while(b != 0)
    {
       quotient.add(a/b);
       temp_a = a;
       a = b;
       b = temp_a % b;
    }

    long temp_x = x;
    long temp_y = y;

    for(int i=0; i<quotient.size()-1; i++)
    {
        x = lx - quotient.indexOf(i) * x;
        y = ly - quotient.indexOf(i) * y;

        lx = x;
        ly = y;

        i++;
        if (i == quotient.size() - 1)
            break;

        x = temp_x - quotient.indexOf(i) * x;
        y = temp_y - quotient.indexOf(i) * y;

        temp_x = x;
        temp_y = y;
    }
    return x;
}
4

5 に答える 5

5

基本的に、Java では long や int などのプリミティブ型は常に値渡しされるため、これを行うことはできません。背景については、オラクルの Java チュートリアルを参照してください。

次のようなクラスを含むカスタムの戻り値を使用すると、この問題を非常に簡単に回避できます。

public class EuclidReturnValues {
    long gcd;
    long latestA;
    long latestB;
}

メソッドの署名をに変更します(コードも変更したと仮定します!)

public EuclidReturnValues extendedEuclid(long a, long b)

編集:

このクラスをユークリッド アルゴリズムを提供するクラスにネストして、テーマに一貫性を持たせることもお勧めします。

于 2013-10-22T08:53:43.777 に答える
1

Javaではできないことがわかりました...

正解です。Java は完全に値渡しです。

...他の解決策はありますか?パラメーター long a は、参照渡しする必要があります。

少なくとも 2 つの「正しい」方法とハックがあります。

  1. 渡された引数を変更しようとしないでください。代わりに、関数の結果として更新された値を返します (xこれにはさまざまな方法があります)。

  2. a更新可能なフィールドを持つオブジェクト インスタンスを渡します。

  3. (ハック)long[1]配列を渡します。a更新できる唯一のエントリになります。

于 2013-10-22T08:47:36.213 に答える
0

よくほとんど。値を変更して呼び出し元のコードに反映させたい場合は、次のようにすることができます。

class ValueHolder {
    long value;
    //getter, setters, etc
}

そして、あなたの代わりにこれを渡しますlong

ValueHolder これは参照渡しではないことに注意してください。値の代わりに参照の値を渡しているだけlongです。

于 2013-10-22T08:48:34.793 に答える
0

LongByReferenceを使用できます 。

https://jna.java.net/javadoc/com/sun/jna/ptr/LongByReference.html

于 2013-10-22T08:48:58.430 に答える
0

プリミティブ値をオブジェクトにラップし、getLongValue()およびsetLongValue()メソッドを公開できます。

于 2013-10-22T08:49:08.523 に答える