0

我有一个问题:如何在方法 extendedEuclid 中将原始长类型作为引用传递?我发现这在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等原始类型来做到这一点,因为它们总是按值传递。查看Oracles Java 教程了解一些背景知识

如果您使用包含类的自定义返回值,则可以非常简单地解决此问题

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

并将您的方法的签名更改为(假设您也更改了代码!)

public EuclidReturnValues extendedEuclid(long a, long b)

编辑:

将此类嵌套到您的 euclid-algorithm-providing 类中可能也是一个好主意,因此它在主题上是连贯的

于 2013-10-22T08:53:43.777 回答
1

我发现这在java中是不可能的......

正确,Java 完全是按值传递的。

...还有其他解决方案吗?参数 long a 必须通过引用传递。

至少有两种“正确”的方式,还有一种技巧:

  1. 不要试图改变传入的参数;相反,将更新的值作为函数的结果返回(与 一起x,有多种方法可以做到这一点)。

  2. 传入具有字段的对象实例,a您可以对其进行更新。

  3. (hack)传入一个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 回答