【问题标题】:Java: Finding the value in an array list that is closest to a particular negative numberJava:在数组列表中查找最接近特定负数的值
【发布时间】:2018-03-05 18:50:14
【问题描述】:

我的问题是如何编写一个方法,将 Doubles 的 ArrayList 作为参数并返回数组列表中最接近 -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;
}

有什么帮助吗?还是执行此任务的更好方法?

【问题讨论】:

  • 为什么你的代码中首先有任何幻数?如果你清理这个烂摊子,你会自动获得一个适用于任何数字的解决方案。
  • 你为什么要Math.abs(s)?我认为如果您删除 Math.abs 代码应该可以工作。
  • ...如果重新分配dist,为什么要计算两次候选距离?此外,这个方法显然不应该打印任何东西。
  • 您可能希望将您的号码添加到数组中对其进行排序,然后使用它旁边的 vakue...
  • @NielsNet 不是O(n)

标签: java compare


【解决方案1】:

如果重新发明轮子不是您的明确目标,您可以将streammin 与自定义比较器一起使用:

public double findClosestTo(ArrayList<Double> arr, double value) {
  return arr.stream().min(
    Comparator.<Double>comparingDouble(x -> Math.abs(x - value))
  ).get();
}

如果数组为空,get 部分(来自Optional)将引发错误。

【讨论】:

    【解决方案2】:

    这里,你得到了s的绝对值:

    if (Math.abs(Math.abs(s) - myNum) < dist) {
                 ^^^^^^^^^^^
    

    这意味着数组中的每个负数都将被视为正数。这就是为什么您的方法找不到最接近 -3.75 的正确数字的原因。

    只需删除abs 调用:

    if (Math.abs(s - myNum) < dist) {
    

    或者,像这样使用 Stream 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 方法是否会被接受......

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      相关资源
      最近更新 更多