首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用计算中值

使用计算中值
EN

Stack Overflow用户
提问于 2020-05-09 18:58:39
回答 2查看 1.3K关注 0票数 1

是否可以使用Java来查找数值集合的中值?我有一个List<Double>类型的变量,它是未排序的。

从JDK9到14的javadocs似乎表明median()不是DoubleStream的有效方法。但是,平均值、最小值、最大值、计数和和是有效的聚合函数。

median()不是一个有效的方法,因为它在流之前需要一个已排序的集合?

这在average()中运行得很好:

代码语言:javascript
复制
   // Function to find average element from a List of Integers in Java 9 and above
   public static Double getAverageWithStream(List<Double> list) {
      OptionalDouble average = list.stream() // Stream<Double>
                                 .mapToDouble(v -> v) // DoubleStream
                                 .average(); // OptionalDouble

      // Print out a message about the 'average' variable's value
      // Note: ifPresentOrElse() was introduced in JDK9
      average.ifPresentOrElse(
         // message the value if one exists
         (value) -> {
            System.out.println("The average value is " + value);
         },
         // Alert the user that there is no value
         () -> {
            System.out.println("No average could be determined!");
         }
      ); // end ifPresentOrElse()

      return average.orElse(Double.NaN);
   } // end getAverageWithStream()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-09 19:25:52

根据@Robert留下的评论,需要以以下方式更改我的方法,以支持中值聚合:

代码语言:javascript
复制
   /**
    * Function to find median element from a List of Integers in Java 9 and above
    * @param list List<Double>
    * @return Double
    */
   public static Double getMedianWithStream(List<Double> list) {
      DoubleStream sortedNumbers = list.stream() // Stream<Double>
                                 .mapToDouble(v -> v) // DoubleStream
                                 .sorted(); // DoubleStream sorted

      OptionalDouble median = (
         list.size() % 2 == 0 ?
         sortedNumbers.skip((list.size() / 2) - 1)
                     .limit(2)
                     .average() :
         sortedNumbers.skip(list.size() / 2)
                     .findFirst()
      );

      // Print out a message about the 'average' variable's value
      // Note: ifPresentOrElse() was introduced in JDK9
      median.ifPresentOrElse(
         // message the value if one exists
         (value) -> {
            System.out.println("The median value is " + value);
         },
         // Alert the user that there is no value
         () -> {
            System.out.println("No median could be determined!");
         }
      ); // end ifPresentOrElse()

      return median.orElse(Double.NaN);
   } // end getAverageWithStream()
票数 0
EN

Stack Overflow用户

发布于 2020-05-09 19:17:28

没有中位数(),您必须自己滚动,不过我认为,考虑到排序的性质,排序是必需的。

如果您使用的是中位数(而不是平均值)的数学定义,那么只需找到排序列表的中间部分:

代码语言:javascript
复制
mylist.sort()
int median = mylist[list.size/2]

但是,您需要将您的流转换成一个列表来完成这个任务,这可能不是您想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61702154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档