我有一个问题:如何在方法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;
}
答案 0 :(得分:5)
基本上:你不能用Java中的long,int等原始类型来做这件事,因为它们总是按值传递。查看Oracles Java tutorials了解背景信息
如果您使用包含类似
的类的自定义返回值,则可以非常简单地解决此问题public class EuclidReturnValues {
long gcd;
long latestA;
long latestB;
}
并将方法的签名更改为(假设您也更改了代码!)
public EuclidReturnValues extendedEuclid(long a, long b)
修改强>
将此类嵌入到提供euclid算法的类中也是一个好主意,因此它是主题连贯的
答案 1 :(得分:1)
我发现它在Java中不可能......
正确,Java完全是按值传递的。
......还有其他解决方案吗?参数long a必须通过引用传递。
至少有两个&#34;正确&#34;方式和黑客:
不要尝试更改传入的参数;相反,返回更新后的值作为函数的结果(以及x
,有多种方法可以做到这一点。)
传入一个包含字段a
的对象实例,您可以更新该字段。
(黑客)传递long[1]
数组; a
将是唯一可以更新的条目。
答案 2 :(得分:0)
class ValueHolder {
long value;
//getter, setters, etc
}
并传递此而不是long
。
请注意,这不是通过引用传递的,您只是传递ValueHolder
引用的值而不是long
值。
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以将原始值包装到对象中,并公开getLongValue()
和setLongValue()
方法。