muu*_*ued 21 java java-8 java-stream
我有一系列双值,我想总结并获得最大值.这DoubleStream.summaryStatistics()听起来很完美.该getSum()方法有一个API注释提醒我在我的一个计算机科学课程中学到了什么:如果值按其绝对值排序,求和问题的稳定性往往会更好.但是,DoubleStream不允许我指定要使用的比较器,Double.compareTo如果我调用sorted()流,它将只使用.
因此,我将价值观收集到一个final Stream.Builder<Double> values = Stream.builder();电话中
values.build()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
Run Code Online (Sandbox Code Playgroud)
然而,这看起来有点冗长,我宁愿使用DoubleStream.Builder而不是通用的构建器.我是否错过了某些内容或者我是否真的必须使用盒装版本的流才能指定比较器?
ass*_*ias 13
原始流没有重载sorted方法,将按自然顺序排序.但回到你的根本问题,有一些方法可以提高总和的准确性,而不涉及首先对数据进行排序.
一种这样的算法是Kahan求和算法,它恰好由OpenJDK/Oracle JDK在内部使用.
这无疑是一个实现细节,因此通常的警告适用(非OpenJDK/Oracle JDK或未来的OpenJDK JDK可能采取其他方法等)
另见这篇文章:应该添加浮点数以获得最精确的结果?
Tag*_*eev 10
唯一可能的排序方法DoubleStream是打包/取消装箱:
double[] input = //...
DoubleStream.of(input).boxed()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
Run Code Online (Sandbox Code Playgroud)
然而,由于Kahan求和在内部使用,差异应该不是很显着.在大多数应用中,未排序的输入将产生良好的结果准确性.当然,您应该自己测试未分类的总和是否满足您的特定任务.
| 归档时间: |
|
| 查看次数: |
961 次 |
| 最近记录: |