我的问题是我如何编写一个方法,该方法将双精度数组列表作为参数,并在数组列表中返回最接近 -3.75 的 Double。
我为正数 3.42 编写了代码,但我无法对其进行修改以适应 -3.75
public static double question3(ArrayList<Double> input) {
double myNum = 3.42.;
double dist = Double.POSITIVE_INFINITY;
double closest = 0.0;
for (Double s : input) {
if (Math.abs(Math.abs(s) - myNum) < dist) {
dist = Math.abs(Math.abs(s) - myNum);
closest = s;
}
}
System.out.println(closest);
return closest;
}
有什么帮助吗?或者执行此任务的更好方法?
如果重新发明轮子不是您的明确目标,您可以将 stream
的min
与自定义比较器一起使用:
public double findClosestTo(ArrayList<Double> arr, double value) {
return arr.stream().min(
Comparator.<Double>comparingDouble(x -> Math.abs(x - value))
).get();
}
如果数组为空,get
部分(来自 Optional
(将抛出错误。
在这里,你得到了 s
的绝对值:
if (Math.abs(Math.abs(s) - myNum) < dist) {
^^^^^^^^^^^
这意味着数组中的每个负数都将被视为正数。这就是为什么您的方法找不到最接近 -3.75 的正确数字的原因。
只需删除abs
调用:
if (Math.abs(s - myNum) < dist) {
或者,使用如下所示的流 API:
return input.stream()
// compares the value of Math.abs(x - myNum), where x is each element of input
.min(Comparator.comparingDouble(x -> Math.abs(x - myNum)))
// returns positive infinity if there is nothing in "input"
.orElse(Double.POSITIVE_INFINITY);
但由于这看起来像家庭作业,我怀疑流 API 方法是否会被接受......