如何使用流来计算接收输入的数组的总和?

时间:2015-03-05 04:12:14

标签: java input arraylist java-8 java-stream

我是使用数组编程的新手,所以我不知道如何计算接收输入的数组的总和。通过研究,我已经学会了如何设置一个数组以及如何使用流来计算数组的总和,但是当数组接收输入时(这样它不会以设定值开始),我不知道如何计算总和。这是我的代码:

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都是导入的。

3 个答案:

答案 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)

您可以将reduceDouble::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