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


141

我在查找Java数组中所有整数的总和时遇到问题。我在Math课堂上找不到任何有用的方法。


15
编写自己的代码,代码长度为2-3行。
wkl 2010年

2
不幸的是,以上(及以下)“答案”是“ Java方式”:-/您可以使用Functional Java库,但是处理Java语法非常麻烦。

1
我知道这个问题非常古老,但是下面msayag答案似乎应该标记为已接受的答案。
马祖(Matsu Q.)2016年

您自己编写的问题是循环。当您将3个数字相加时,您应该可以在一条指令中完成。
Al G Johnston

Answers:


269

您可以使用流:

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.*;

1
如果数组包含大量数字且总和超出int范围怎么办?
thanhbinh84 '16

5
在这种情况下,您可以使用LongStream,只要long sum = IntStream.of(a).asLongStream()。sum(); 或long sum = LongStream.of(a).sum();
msayag

2
使用流是否有相当大的速度优势?
mvorisek

1
如果您的总和不适合长期使用,则应该按对进行总和(分而治之),因为将较小的BigDecimals相加会更快。
user482745 '18

1
@HosseinRahimijava.util.stream.DoubleStream.of(a).sum();
ggorlen

48

如果您使用的是Java 8,则Arrays该类提供了一种stream(int[] array)方法,该方法返回IntStream具有指定int数组的序列。它也已为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

最后,它可以采用type数组T。因此,根据示例,您可以有一个String包含数字作为输入的数字,如果要对它们求和,只需执行以下操作:

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

35

这是标准Java API中不存在的那些简单事物之一(AFAIK)。编写自己的东西很容易。

其他答案也很好,但这是一个带有每个语法糖的答案。

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

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

此外,Java 7语言规范中甚至显示了数组求和的示例。该示例来自第10.4节-数组访问

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);
    }
}

但这并不能一add而就。效率低下。
Al G Johnston


15

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


为什么只使用statutils:D
Lore

13

我要添加到以前的解决方案中的唯一一点是,我将使用很长的时间来累加总数,以避免任何价值溢出。

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

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

6
int sum = 0;

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

4
您可以使用for-each循环(在Java 1.5中引入)使其变得更好。
wkl 2010年

6

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,您可以使用缩减概念进行添加。

阅读有关还原的所有信息


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

4

恕我直言,求和函数似乎很适合扩展Arrays类,其中填充,排序,搜索,复制和等于实时存在。javadocs中隐藏了许多方便的方法,因此在将Fortran移植到Java以便在滚动我们自己的帮助器方法之前进行询问时,这是一个公平的问题。在巨大的javadoc索引中搜索“ sum”,“ add”和您可能想到的任何其他关键字。您可能会怀疑肯定有人已经对基本类型int,float,double,Integer,Float,Double执行了此操作?无论多么简单,检查始终是一件好事。保持代码尽可能简单,不要重蹈覆辙。


3

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

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);

3

我用这个:

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;
}

1
C程序员,是吗?
towi

2

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

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


2

此练习有两件事要学习:

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

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

2

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

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;
}


1

使用以下逻辑:

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;
     }

1

这取决于。您要添加多少个数字?测试以上许多建议:

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核,16 G 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

0

这种事情没有“数学课上的方法”。它不像它的平方根函数或类似的东西。

您只需要有一个用于求和的变量,然后遍历数组,将找到的每个值添加到和。


0
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 
     }
} 

现有答案的副本。
james.garriss '16

0

我们可能会使用用户定义的功能。首先,初始化和变量等于零。然后遍历数组,并向其添加元素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);
    }
}

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

0

有点惊讶地看到上述答案都没有考虑到使用线程池可以使它快很多倍。在这里,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).parallel()。map(x-> x * x).reduce(0,(a,b)-> a + b)。想法是您仍然可以执行归约操作,而不需要映射。


不一定最快。对于小N,Loop的表现将更好。
gerardw

-1
 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);

     }
  } 

1
老兄,它是sum = sum + a [i];
Maksim Kniazev

-1
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);

    }

}

-3

从Java 8开始,可以使用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;
});

返回或打印总和。


1
Works:int [] nums = {1,2}; final int [] sum = {0}; ArrayList <Integer>列表=新ArrayList <Integer>(); for(int each:nums){list.add(each); } list.stream()。forEach(每个-> {sum [0] + = each;});
朱洛夫·康斯坦丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.