我是使用数组编程的新手,所以我不知道如何计算接收输入的数组的总和。通过研究,我已经学会了如何设置一个数组以及如何使用流来计算数组的总和,但是当数组接收输入时(这样它不会以设定值开始),我不知道如何计算总和。这是我的代码:
public class TestClass {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
ArrayList a = new ArrayList();
for (int i = 0; i < 20; ++i){
double b = sc.nextDouble();
a.add(b);
int[] c = a;//This step is where I get lost. I'm not sure what needs to happen to a
Arrays.stream(c);
System.out.println(Arrays.stream(c).sum());
}
}
}
由于
注意:java.util。*,java.io。*,java.util.stream。*和java.util.Arrays都是导入的。
答案 0 :(得分:1)
您认为首先考虑您的任务。您要求扫描仪提供double
值,稍后您需要int[]
数组。这不匹配。
正如其他人所说,不需要数组,如果要将值总结为double
,请将列表声明为List<Double>
以澄清这一点。然后,您只需简单地对列表进行流式处理即可将其归结为list.stream().reduce(Double::sum).orElse(0)
或list.stream().mapToDouble(Double::doubleValue).sum()
。
但是,如果您只对总和感兴趣,则根本不需要列表:
Scanner sc = new Scanner(System.in);
double sum=0;
for (int i = 0; i < 20; ++i) {
sum += sc.nextDouble();
System.out.println(sum);
}
具有相同的效果。它不使用Stream
,但使用流没有任何好处。
如果您想通过Stream
解决任务“总结二十个输入值”,您可以考虑省略中间总和。在这种情况下,有一个清洁的解决方案:
Scanner sc = new Scanner(System.in);
double sum=DoubleStream.generate(sc::nextDouble).limit(20).sum();
System.out.println(sum);
答案 1 :(得分:0)
您可以将reduce
与Double::sum
结合使用:
Scanner sc = new Scanner(System.in);
List<Double> arr = new ArrayList<>(); // Use generics - never use raw types!
for (int i = 0; i < 20; ++i) {
Double b = sc.nextDouble();
arr.add(b);
sc.nextLine(); // <-- add this line in order to be able to feed numbers manually
}
Double res = arr.stream().reduce(Double::sum).get();
System.out.println(res);
答案 2 :(得分:0)
作为alfasin提供的主题的变体,您可以将Stream
专门化为DoubleStream
,并在其上使用sum
方法。
List<Double> arr = new ArrayList<>();
... enrol the numbers ...
double sum = arr.stream().mapToDouble(d -> d).sum();
正如Jean-François Savard所述,您应该知道此解决方案中您的原始List
已更改为List<Double>
。如果您想知道原因,请阅读Generics。