【问题标题】:How to return NaN if ArrayList is empty如果 ArrayList 为空,如何返回 NaN
【发布时间】:2021-08-31 02:48:13
【问题描述】:

我正在做一个 Java 练习,要求我返回一个数字列表的平均值。如果arrayList为空,则返回NaN。

public class ListAverage {
    public static double findAverageDouble(ArrayList<Double> numbers) {
        if(numbers.size() != 0) {
            numbers = new ArrayList<Double>();
            
            double sum = 0.0;
            
            for(double num : numbers){
                sum += num;
            }
            
            double average = (sum / numbers.size());
            
            return average;
        } else {
            return NaN;
        }
    }
}

我很确定我的第一部分(求平均值)是正确的。但是如何返回 NaN?感谢您的帮助!


编辑:在我返回 Double.NaN 之后。 我收到了这个错误,其中所有测试用例都返回 NaN。

【问题讨论】:

  • java 中没有 NaN。 Null 可以返回
  • @leoOrion Java 双重遵守 IEEE 规范,因此它可以保存值 NaN。

标签: java list arraylist


【解决方案1】:

Java 中没有 NaN 本身,但有常量 Double.NaNFloat.NaN。返回其中一个。

Java NaN

您还可以减少代码的嵌套

public static double findAverageDouble(ArrayList<Double> numbers) {
    if(numbers.size() == 0) {
        return Double.NaN;
    }
        
    double sum = 0.0;
        
    for(double num : numbers) {
        sum += num;
    }
        
    double average = (sum / numbers.size());
        
    return average;
}

更新: 排队

numbers = new ArrayList<Double>();

您会覆盖丢失值的列表,因此非空列表的答案将始终为 0。删除此行。

【讨论】:

  • 我不明白我在使用我的代码和你的代码时遇到的错误。能否请你帮忙?我已经编辑了我的帖子
  • @HY2000 如果您仍然遇到错误,我们需要minimal reproducible example 来帮助您解决问题。
【解决方案2】:

流解决方案

这可能不是您所追求的,也许这是为了锻炼。平均一个双数列表是内置的,或者几乎是。

public static double findAverageDouble(ArrayList<Double> numbers) {
    return numbers.stream()
            .mapToDouble(Double::doubleValue)
            .average()
            .orElse(Double.NaN);
}

DoubleStream.average() 返回一个 OptionalDouble,您可以考虑直接返回它而不是 NaN。在上面的代码中,我相信你的话,并使用orElse() 选择 NaN 作为返回值,以防列表为空。

【讨论】:

  • 感谢您发布基于Stream 的解决方案。任何认真对待 Java 技术职业的人(包括 OP)都必须在适当的时候学习和使用Stream API。
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多