Java 8 Stream.sum()的错误行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java 8 Stream.sum()的错误行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2075字,纯文字阅读大概需要3分钟。
内容图文
![Java 8 Stream.sum()的错误行为](/upload/InfoBanner/zyjiaocheng/734/523e5021ab4044a4a9a00444f0cbe292.jpg)
今天在解决HackerRank上的this问题时,我使用了Array stream .sum()函数对所有条目求和并继续我的算法.但总而言之,我发现我的算法在某些情况下失败了.我使用diff来发现它通过了99%的情况,1%的输出几乎相等,但小于原始答案.这就是为什么我用for循环替换了流.sum(),并且意外地它通过了所有的测试用例.我试过但无法确定这种不确定的行为.
我使用stream.sum()的实现:
public class MandragoraForest {
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
for (int i = in.nextInt(); i > 0; i--) {
int number = in.nextInt();
int[] h = new int[number];
for (int j = 0; j < number; j++) h[j] = in.nextInt();
System.out.println(new MandragoraForestSolver().solve(h));
}
}
}
class MandragoraForestSolver {
public long solve(int[] h) {
if (h.length==1) return h[0];
Arrays.parallelSort(h);
long sum = Arrays.stream(h)
.sum();
long ans = -1;
for (long i=0, strength = 2; i<h.length; i++, strength++) {
sum -= h[(int)i];
ans = Math.max(ans, strength * sum);
}
return ans;
}
}
没有Java流的实现:
public class MandragoraForest {
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
for (int i = in.nextInt(); i > 0; i--) {
int number = in.nextInt();
int[] h = new int[number];
long sum = 0;
for (int j = 0; j < number; j++) {
h[j] = in.nextInt();
sum += h[j];
}
System.out.println(new MandragoraForestSolver().solve(h, sum));
}
}
}
class MandragoraForestSolver {
public long solve(int[] h, long sum) {
if (h.length==1) return h[0];
Arrays.parallelSort(h);
long ans = -1;
for (long i=0, strength = 2; i<h.length; i++, strength++) {
sum -= h[(int)i];
ans = Math.max(ans, strength * sum);
}
return ans;
}
}
有什么东西我错过了吗?这种行为可能是什么原因?
解决方法:
使用流和循环之间存在一个显着差异 – 算术溢出的可能性.
Arrays.stream(int [])返回一个IntStream,其sum()方法返回一个int结果.如果总和超过Integer.MAX_VALUE,则会发生静默整数溢出.
但是,你的循环总和是通过将int值添加到一个长整数,这不会受到算术溢出的影响.
其中一个测试中的整数之和必须超过Integer.MAX_VALUE,测试long用于(正确)计算总数.
如果要使用流来求和,则需要将IntStream转换为LongStream,您可以这样做:
long sum = Arrays.stream(big).asLongStream().sum();
内容总结
以上是互联网集市为您收集整理的Java 8 Stream.sum()的错误行为全部内容,希望文章能够帮你解决Java 8 Stream.sum()的错误行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。