当前位置: 首页 > 知识库问答 >
问题:

按绝对数量级对(流)进行排序加倍

权韬
2023-03-14

我有一系列的双值,我想求和,得到最大值。DoubleStream。summaryStatistics()听起来非常适合这样做。getSum()方法有一个API注释,提醒我在我的一门计算机科学课程中学到了什么:如果按绝对值排序,求和问题的稳定性往往会更好。但是,DoubleStream不允许我指定要使用的比较器,它只会使用Double。如果我在流中调用sorted(),则比较。

因此,我将这些值收集到一个最终流中。建设者

values.build()
    .sorted(Comparator.comparingDouble(Math::abs))
    .mapToDouble(a -> a).summaryStatistics();

然而,这看起来有些冗长,我更喜欢使用DoubleStream。Builder而不是通用构建器。我错过了什么还是真的必须使用流的盒装版本才能指定比较器?


共有2个答案

纪实
2023-03-14

对DoubleStream进行排序的唯一可能方法是将其装箱/取消装箱:

double[] input = //...
DoubleStream.of(input).boxed()
    .sorted(Comparator.comparingDouble(Math::abs))
    .mapToDouble(a -> a).summaryStatistics();

然而,由于Kahan求和在内部使用,差异应该不是很显著。在大多数应用中,未分类的输入将产生良好的结果精度。当然,你应该自己测试,如果未排序的总和对于你的特定任务来说是令人满意的。

浦墨竹
2023-03-14

原始流没有重载的sorted方法,将按自然顺序进行排序。但回到你的根本问题,有一些方法可以提高总和的准确性,而不需要首先对数据进行排序。

一种这样的算法是Kahan求和算法,它恰好被OpenJDK/Oracle JDK在内部使用。

诚然,这是一个实现细节,因此通常的警告适用(非OpenJDK/Oracle JDK或未来的OpenJDK JDK可能会采取替代方法等)

另请参阅这篇文章:应该按哪个顺序添加浮点数以获得最精确的结果?

 类似资料:
  • 问题内容: 我需要对一个包含每个人年龄的数组列表进行排序,但是我必须打印出一个65岁以上的人的列表。我知道如何用SQL而不是Java来做到这一点。任何帮助,将不胜感激。谢谢! 问题答案: 首先,请确保您已充分说明了问题,然后考虑首先要使用的算法(不是特定于语言的);然后实施算法。 如果问题仅在于列出年龄在65岁以上(不是65岁或65岁以上)的所有人员,则只需要遍历该数组,并针对每一行检查年龄是否符

  • 我有一个班的学生有以下领域: 字段“状态”可以有2个值:1。现在,2。缺席的 然后我有一个可观察的列表: 因此,我将学生存储在这个列表中。每个学生都有出席或缺席状态。 我需要按状态对这个观察列表进行排序。我希望目前状态的学生在该列表中名列第一。 有什么建议吗? 如果有任何帮助,我将不胜感激。

  • 问题内容: 如何按其字段之一(例如或)对对象数组进行排序? 问题答案: 使用usort,这是从手册改编而成的示例: 您还可以将任何callable用作第二个参数。这里有些例子: 使用匿名函数(来自PHP 5.3) 从班级内部 使用箭头函数(来自PHP 7.4) 另外,如果要比较数字值,则应使用“比较”功能。

  • 我想像下面这样对流进行反向排序,但是编译时错误为。有人能纠正这个吗

  • 问题内容: 我有一个包含多个数组的数组,我想根据这些数组中的某个字符串对数组进行排序。 如何按名称排序,以便 阿尔伯特排 在首位, 齐默尔曼排 在最后? 我知道如果可以使用整数进行排序,但是字符串使我毫无头绪,该怎么办。 谢谢您帮忙!:) 问题答案: 这可以通过将支持函数作为参数传递给方法调用来实现。 像这样:

  • 问题内容: 我有这个: 和[电影]数组。如何按名称的字母顺序对数组进行排序?我试过了: 和 但这不起作用,因为我没有访问电影的名称属性。 问题答案: 在传递给的闭包中,比较要排序的属性。像这样: 或以下要绕过案例的案例: 旁注: 通常,只有类型以大写字母开头;我建议使用and ,而不是and 。 例如,在操场上: 将按顺序 Swift5更新