【发布时间】:2016-03-16 22:12:40
【问题描述】:
快速提问。我目前正在制作一个合成除法计算器,作为其中的一部分,我需要测试 P/Q(双精度)是否可以作为方程中的一个因素(作为整数列表提供给该方法)。
这是我在主类中的代码:
public static void main(String[] args)
{
List<Integer> coeffs = new ArrayList<>();
coeffs.add(1);
coeffs.add(-6);
coeffs.add(11);
coeffs.add(-6);
System.out.println(coeffs); // Returns [1, -6, 11, -6]
System.out.println(doesPqWork(coeffs, 1)); // Returns 'true' as intended
System.out.println(coeffs); // Returns [-6, 11, -6]
System.out.println(doesPqWork(coeffs, -2)); // Returns 'false' not as intended
System.out.println(coeffs); // Returns [11, -6]
System.out.println(doesPqWork(coeffs, 3)); // Returns 'false' not as intended
System.out.println(coeffs); // Returns [-6]
}
这是 P/Q 方法本身:
private static boolean doesPqWork(List<Integer> coefficients, double PQ)
{
List<Double> results = new ArrayList<>();
double lastResult = coefficients.get(0);
coefficients.remove(0);
for(int coeff : coefficients) // 2, 1
{
double multiplied = PQ * lastResult;
lastResult = coeff + multiplied;
results.add(lastResult);
}
return results.get(results.size() - 1) == 0;
}
请忽略此方法如何计算它,我只是想知道为什么“coeffs”ArrayList 每次都在缩小。我已经用 Java 编码两年了,我从来没有遇到过这个问题。
我认为这是因为当我调用“coefficients.remove(0)”时,由于某种原因链接回“main”方法中的“coeffs”列表,但是当我创建一个新变量时,它不会可能链接回来它仍然会做奇怪的事情。
我知道一种方法可以通过创建一些断断续续的代码和重复变量来解决此问题,但这似乎非常浪费,我真的很想知道这种意外行为的根源,以便我可以解决它。
我可能在这里犯了一个愚蠢的错误,但如果我不是,那么有人可以向我解释到底发生了什么吗?哈哈。
【问题讨论】:
-
我的意思是你打电话给 coefficients.remove(0) 所以,除非我遗漏了什么,否则我会认为这就是为什么......
-
是的,但这不会只影响新的“coefficients”变量而不影响“coeffs”变量吗?我认为出于某种原因,Java 认为这两个变量是相同的,所以我创建了第三个等于“系数”的变量并使用它来代替,但同样的行为发生在“系数”变量每次收缩的地方。 “remove()”方法是否也有可能有问题?
-
不,你有误会。您在
main中多次致电doesPqwork。每次调用它,它都在运行该方法并调用remove -
抱歉,我现在从下面的 par 中知道,当您将它传递给方法时,它实际上不是副本。
-
这不是一个论坛不要编辑标题说“已解决”或将其添加到内容中。用复选标记将答案标记为正确,以表明它解决了您的问题。对正确答案和任何对您有帮助的人投赞成票,对任何不正确或无用的问题投反对票。
标签: java arraylist methods call