如何在 Java 中找到数组中所有数字的和?

我在 Java 中找到一个数组中所有整数的和时遇到了一个问题。我在 Math类中找不到任何有用的方法。

813411 次浏览

你得自己卷。
从总数0开始。然后考虑数组中的每个整数,将其添加到总数中。当你没有整数的时候,你就得到了和。

如果没有整数,则总数为0。

int sum = 0;


for (int i = 0; i < yourArray.length; i++)
{
sum = sum + yourArray[i];
}

其他语言在 PHP 中有一些类似 array _ sum ()的方法,但 Java 没有。

只是..。

int[] numbers = {1,2,3,4};
int sum = 0;
for( int i : numbers) {
sum += i;
}


System.out.println(sum);

没有“数学课上的方法”可以解决这种问题。它不是平方根函数之类的。

您只需要为 sum 创建一个变量,然后循环遍历数组,将找到的每个值添加到 sum 中。

int sum = 0;
for (int i = 0; i < myArray.length; i++)
sum += myArray[i];
}

从这个练习中可以学到两件事:

您需要以某种方式遍历数组的元素-您可以使用 for 循环或 while 循环来做到这一点。 您需要将求和的结果存储在一个累加器中。为此,您需要创建一个变量。

int accumulator = 0;
for(int i = 0; i < myArray.length; i++) {
accumulator += myArray[i];
}

这是标准 JavaAPI 中不存在的简单事情之一(AFAIK)。写自己的很容易。

其他的答案完全没问题,但这里有一个“ for-each”句法糖。

int someArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = 0;


for (int i : someArray)
sum += i;

此外,数组求和的一个例子甚至是 在 Java7语言规范中显示

class Gauss {
public static void main(String[] args) {
int[] ia = new int[101];
for (int i = 0; i < ia.length; i++) ia[i] = i;
int sum = 0;
for (int e : ia) sum += e;
System.out.println(sum);
}
}

您可以像下面这样使您的代码看起来更好:

public void someMethod(){
List<Integer> numbers = new ArrayList<Integer>();
numbers.addAll(db.findNumbers());
...
System.out.println("Result is " + sumOfNumbers(numbers));
}


private int sumOfNumbers(List<Integer> numbers){
int sum = 0;
for (Integer i : numbers){
sum += i;
}
return sum;
}

对于以前的解决方案,我要补充的唯一一点是,我将使用 long 来累积总额,以避免任何价值溢出。

int[] someArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Integer.MAX_VALUE};
long sum = 0;


for (int i : someArray)
sum += i;

恕我直言,求和函数似乎很适合扩展 Array 类,其中填充、排序、搜索、复制 & 等于 live。有很多方便的方法隐藏在 javadocs 中,所以在运行我们自己的 helper 方法之前,将 Fortran 移植到 java 来询问这个问题是一个合理的问题。在庞大的 javadoc 索引中搜索“ sum”、“ add”和任何你可能想到的关键字。您可能会怀疑,肯定有人已经为原语类型 int、 Float、 Double、 Integer、 Float、 Double 做过这种处理了吧?无论多么简单,检查总是好的。让代码尽可能简单,不要重新发明轮子。

 public class Num1
{
public static void main ()
{
//Declaration and Initialization
int a[]={10,20,30,40,50}


//To find the sum of array elements
int sum=0;
for(int i=0;i<a.length;i++)
{
sum=sum+i;
}


//To display the sum
System.out.println("The sum is :"+sum);


}
}

中,您可以使用流:

int[] a = {10,20,30,40,50};
int sum = IntStream.of(a).sum();
System.out.println("The sum is " + sum);

产出:

总数是150。

java.util.stream包裹里

import java.util.stream.*;

我个人喜欢这个方法,我的代码风格有点奇怪。

public static int sumOf(int... integers) {
int total = 0;
for (int i = 0; i < integers.length; total += integers[i++]);
return total;
}

在代码中很容易使用:

int[] numbers = { 1, 2, 3, 4, 5 };
sumOf(1);
sumOf(1, 2, 3);
sumOf(numbers);

在 Apache Math 中: 有 StatUtils.sum(double[] arr)

class Addition {


public static void main() {
int arr[]={5,10,15,20,25,30};         //Declaration and Initialization of an Array
int sum=0;                            //To find the sum of array elements
for(int i:arr) {
sum += i;
}
System.out.println("The sum is :"+sum);//To display the sum
}
}

如果您使用的是 Java8,那么 Arrays类提供了一个 stream(int[] array)方法,该方法返回具有指定 int数组的顺序 IntStream。对于 doublelong阵列,它也被重载。

int [] arr = {1,2,3,4};
int sum = Arrays.stream(arr).sum(); //prints 10

它还提供了一种方法 stream(int[] array, int startInclusive, int endExclusive) ,它允许您获取数组的指定范围(这可能很有用) :

int sum = Arrays.stream(new int []{1,2,3,4}, 0, 2).sum(); //prints 3

最后,它可以采用 T类型的数组。因此,每个例子都可以有一个包含数字的 String作为输入,如果你想对它们求和,只需要:

int sum = Arrays.stream("1 2 3 4".split("\\s+")).mapToInt(Integer::parseInt).sum();
public class AddDemo {


public static void main(String[] args) {


ArrayList <Integer>A = new ArrayList<Integer>();


Scanner S = new Scanner(System.in);


System.out.println("Enter the Numbers: ");


for(int i=0; i<5; i++){


A.add(S.nextInt());
}


System.out.println("You have entered: "+A);


int Sum = 0;


for(int i=0; i<A.size(); i++){


Sum = Sum + A.get(i);


}


System.out.println("The Sum of Entered List is: "+Sum);


}


}

我用这个:

public static long sum(int[] i_arr)
{
long sum;
int i;
for(sum= 0, i= i_arr.length - 1; 0 <= i; sum+= i_arr[i--]);
return sum;
}

Java 8

密码 :

   int[] array = new int[]{1,2,3,4,5};
int sum = IntStream.of(array).reduce( 0,(a, b) -> a + b);
System.out.println("The summation of array is " + sum);


System.out.println("Another way to find summation :" + IntStream.of(array).sum());

产出 :

The summation of array is 15
Another way to find summation :15

解说 :

Java 8中,你可以使用还原的概念来做你的加法。

阅读所有关于减少

从 Java8开始,lambda 表达式的使用已经变得可用。

看这个:

int[] nums = /** Your Array **/;

紧凑型:

int sum = 0;
Arrays.asList(nums).stream().forEach(each -> {
sum += each;
});

喜欢:

int sum = 0;


ArrayList<Integer> list = new ArrayList<Integer>();


for (int each : nums) { //refer back to original array
list.add(each); //there are faster operations…
}


list.stream().forEach(each -> {
sum += each;
});

返还或打印金额。

下划线-java库中有一个 sum ()方法。

代码示例:

import com.github.underscore.U;


public class Main {
public static void main(String[] args) {
int sum = U.sum(java.util.Arrays.asList(1, 2, 3, 4));


System.out.println(sum);
// -> 10
}
}

我们可以使用用户定义的函数。首先初始化 sum 变量等于零。然后遍历数组并用 sum 添加元素。然后更新 sum 变量。

代码片段:

import java.util.*;
import java.lang.*;
import java.io.*;




class Sum
{
public static int sum(int arr[])
{
int sum=0;


for(int i=0; i<arr.length; i++)
{
sum += arr[i];
}
return sum;
}


public static void main (String[] args)
{
int arr[] = {1, 2, 3, 4, 5};


int total = sum(arr);


System.out.printf("%d", total);
}
}

使用以下逻辑:

static int sum()
{
int sum = 0; // initialize sum
int i;


// Iterate through all elements summing them up
for (i = 0; i < arr.length; i++)
sum +=  arr[i];


return sum;
}
/**
* Sum of all elements from 1 to 1000
*/
final int sum = Stream.iterate(1, n -> n + 1).limit(1000).mapToInt(el -> el).sum();

看到以上的答案都没有考虑到使用线程池可以快很多倍,这有点令人惊讶。在这里,parallel使用 fork-join 线程池,并自动在多个部分中断流,并且并行运行它们,然后进行合并。如果你只记得下面这行代码,你可以在很多地方使用它。

所以最快最甜的短代码奖得主是

int[] nums = {1,2,3};
int sum =  Arrays.stream(nums).parallel().reduce(0, (a,b)-> a+b);

假设您想要执行 sum of squares,然后执行 Arrays.stream (nums)。并行()。地图(x-> x * x)。减少(0,(a,b)-> a + b)。想法是你仍然可以执行减少,没有地图。

这要看情况。你要加多少个数字? 测试上面的许多建议:

import java.text.NumberFormat;
import java.util.Arrays;
import java.util.Locale;


public class Main {


public static final NumberFormat FORMAT = NumberFormat.getInstance(Locale.US);


public static long sumParallel(int[] array) {
final long start = System.nanoTime();
int sum = Arrays.stream(array).parallel().reduce(0,(a,b)->  a + b);
final long end = System.nanoTime();
System.out.println(sum);
return  end - start;
}


public static long sumStream(int[] array) {
final long start = System.nanoTime();
int sum = Arrays.stream(array).reduce(0,(a,b)->  a + b);
final long end = System.nanoTime();
System.out.println(sum);
return  end - start;
}


public static long sumLoop(int[] array) {
final long start = System.nanoTime();
int sum = 0;
for (int v: array) {
sum += v;
}
final long end = System.nanoTime();
System.out.println(sum);
return  end - start;
}


public static long sumArray(int[] array) {
final long start = System.nanoTime();
int sum = Arrays.stream(array) .sum();
final long end = System.nanoTime();
System.out.println(sum);
return  end - start;
}


public static long sumStat(int[] array) {
final long start = System.nanoTime();
int sum = 0;
final long end = System.nanoTime();
System.out.println(sum);
return  end - start;
}




public static void test(int[] nums) {
System.out.println("------");
System.out.println(FORMAT.format(nums.length) + " numbers");
long p = sumParallel(nums);
System.out.println("parallel " + FORMAT.format(p));
long s = sumStream(nums);
System.out.println("stream " +  FORMAT.format(s));
long ar = sumArray(nums);
System.out.println("arrays " +  FORMAT.format(ar));
long lp = sumLoop(nums);
System.out.println("loop " +  FORMAT.format(lp));


}


public static void testNumbers(int howmany) {
int[] nums = new int[howmany];
for (int i =0; i < nums.length;i++) {
nums[i] = (i + 1)%100;
}
test(nums);
}


public static void main(String[] args) {
testNumbers(3);
testNumbers(300);
testNumbers(3000);
testNumbers(30000);
testNumbers(300000);
testNumbers(3000000);
testNumbers(30000000);
testNumbers(300000000);
}
}

我发现,使用一个8核16G 的 Ubuntu18机器,对于较小的值,循环是最快的,对于较大的值,并行是最快的。当然,这取决于您所运行的硬件:

------
3 numbers
6
parallel 4,575,234
6
stream 209,849
6
arrays 251,173
6
loop 576
------
300 numbers
14850
parallel 671,428
14850
stream 73,469
14850
arrays 71,207
14850
loop 4,958
------
3,000 numbers
148500
parallel 393,112
148500
stream 306,240
148500
arrays 335,795
148500
loop 47,804
------
30,000 numbers
1485000
parallel 794,223
1485000
stream 1,046,927
1485000
arrays 366,400
1485000
loop 459,456
------
300,000 numbers
14850000
parallel 4,715,590
14850000
stream 1,369,509
14850000
arrays 1,296,287
14850000
loop 1,327,592
------
3,000,000 numbers
148500000
parallel 3,996,803
148500000
stream 13,426,933
148500000
arrays 13,228,364
148500000
loop 1,137,424
------
30,000,000 numbers
1485000000
parallel 32,894,414
1485000000
stream 131,924,691
1485000000
arrays 131,689,921
1485000000
loop 9,607,527
------
300,000,000 numbers
1965098112
parallel 338,552,816
1965098112
stream 1,318,649,742
1965098112
arrays 1,308,043,340
1965098112
loop 98,986,436

这里的大多数答案都是使用内置函数-
如果你想知道这些问题背后的整个逻辑,以下是我的答案:

import java.util.*;


public class SumOfArray {
public static void main(String[] args){
Scanner inp = new Scanner(System.in);
int n = inp.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = inp.nextInt();
}
System.out.println("The sum of the array is :" + sum(arr));
}
static int sum(int[] arr){
int sum = 0;
for (int a = 0; a < arr.length; a++){
sum = sum + arr[a];
}
return sum;
}
}

如果你有一个 double 类型的数组,我有一个正确的解决方案,那么这个方法可以用来计算它的元素之和。同时,它使用数学课

import org.apache.commons.math3.stat.StatUtils;
 

public class ArraySum {
 

public static void main(String[] args) {
double[] array = { 10, 4, 17, 33, -2, 14 };
int sum = (int)StatUtils.sum(array);
System.out.println("Sum of array elements is: " + sum);
}
}