如何使用流来计算接收输入的数组的总和?
How can a stream be used to calculate the sum of an array that receives input?
我是数组编程的新手,所以我不确定如何计算接收输入的数组的总和。通过研究,我学会了如何设置数组以及如何使用流计算数组的总和,但是当数组接收到输入时(这样它就不会以设定值开头),我不知道如何计算总和。这是我的代码:
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.数组全部导入。
您可以将 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);
作为alfasin, you can specialise the Stream
as a DoubleStream
and utilise the sum
方法呈现主题的变体就可以了。
List<Double> arr = new ArrayList<>();
... enrol the numbers ...
double sum = arr.stream().mapToDouble(d -> d).sum();
如Jean-François Savard, you should be aware that that your original List
has been changed to List<Double>
in this solution. If you want to know why, read up on Generics所述。
你先想想你的任务。您正在向扫描器询问 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);
我是数组编程的新手,所以我不确定如何计算接收输入的数组的总和。通过研究,我学会了如何设置数组以及如何使用流计算数组的总和,但是当数组接收到输入时(这样它就不会以设定值开头),我不知道如何计算总和。这是我的代码:
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.数组全部导入。
您可以将 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);
作为alfasin, you can specialise the Stream
as a DoubleStream
and utilise the sum
方法呈现主题的变体就可以了。
List<Double> arr = new ArrayList<>();
... enrol the numbers ...
double sum = arr.stream().mapToDouble(d -> d).sum();
如Jean-François Savard, you should be aware that that your original List
has been changed to List<Double>
in this solution. If you want to know why, read up on Generics所述。
你先想想你的任务。您正在向扫描器询问 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);