【问题标题】:How do you find the sum of all the numbers in an array in Java?你如何在Java中找到数组中所有数字的总和?
【发布时间】:2010-12-29 00:35:10
【问题描述】:

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

【问题讨论】:

  • 自己写,代码2-3行。
  • 不幸的是,上面(和下面的)“答案”是“Java方式”:-/您可以使用Functional Java library,但处理Java语法太麻烦了。
  • 我知道这个问题太老了,但下面的answer by msayag 似乎应该被标记为接受的答案。
  • 写自己的问题在于它是一个循环。当您将 3 个数字相加时,您应该能够在一条指令中完成。

标签: java arrays sum


【解决方案1】:

你可以使用流:

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

【讨论】:

  • 如果数组包含大量数字并且总和超出 int 范围怎么办?
  • 在这种情况下,您可以使用 LongStream,只要 sum = IntStream.of(a).asLongStream().sum();或 long sum = LongStream.of(a).sum();
  • 使用流有什么明显的速度优势吗?
  • 如果您的总和不适合长,则应成对求和(分而治之),因为对较小的 BigDecimals 求和更快。
  • @HosseinRahimi java.util.stream.DoubleStream.of(a).sum();
【解决方案2】:

如果您使用的是 Java 8,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();

【讨论】:

    【解决方案3】:

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

    其他答案非常好,但这里有一些 for-each 语法糖。

    int someArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum = 0;
    
    for (int i : someArray)
        sum += i;
    

    另外,数组求和的一个例子是shown in the Java 7 Language Specification。该示例来自第 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);
        }
    }
    

    【讨论】:

    • 但这并不能一下子把所有的数字都加起来。效率低下。
    • 我无法想象它比流解决方案效率低。
    【解决方案4】:

    你不能。其他语言有一些方法,比如 PHP 中的 array_sum(),但 Java 没有。

    只是..

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

    【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 为什么只在 statutils :D
    【解决方案6】:

    我要在之前的解决方案中添加的唯一一点是,我将使用 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;
    

    【讨论】:

      【解决方案7】:
      int sum = 0;
      
      for (int i = 0; i < yourArray.length; i++)
      {
        sum = sum + yourArray[i];
      }
      

      【讨论】:

      • 您可以使用 for-each 循环(在 Java 1.5 中引入)让它变得更好。
      【解决方案8】:

      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,你可以使用归约概念来做你的加法。

      Read all about Reduction

      【讨论】:

        【解决方案9】:
        int sum = 0;
        for (int i = 0; i < myArray.length; i++)
          sum += myArray[i];
        }
        

        【讨论】:

          【解决方案10】:

          恕我直言,求和函数似乎很适合扩展 Arrays 类,其中填充、排序、搜索、复制和等于存在。 javadocs 中隐藏了很多方便的方法,因此在将 Fortran 移植到 java 时,在推出我们自己的辅助方法之前询问是一个公平的问题。在庞大的 javadoc 索引中搜索“sum”、“add”和您可能想到的任何其他关键字。您可能会怀疑肯定有人已经为原始类型 int、float、double、Integer、Float、Double 做了这个?无论多么简单,检查总是好的。使代码尽可能简单,不要重新发明轮子。

          【讨论】:

            【解决方案11】:

            看到以上答案都没有考虑使用线程池可以快几倍。在这里,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) .想法是你仍然可以在没有 map 的情况下执行 reduce。

            【讨论】:

            • 不一定是最快的。对于小 N,Loop 的表现会更好。有关详细信息,请参阅我更长的帖子。
            【解决方案12】:

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

            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
            

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

                我用这个:

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

                【讨论】:

                • C 程序员,嗯?
                【解决方案15】:

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

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

                【讨论】:

                  【解决方案16】:

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

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

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

                  【讨论】:

                    【解决方案17】:

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

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

                    【讨论】:

                      【解决方案18】:

                      使用以下逻辑:

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

                      【讨论】:

                        【解决方案19】:

                        如果您特别有一个 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);
                           }
                        }
                        

                        【讨论】:

                          【解决方案20】:

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

                          【讨论】:

                            【解决方案21】:

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

                            您只需要为总和设置一个变量并循环遍历数组,将您找到的每个值添加到总和中。

                            【讨论】:

                              【解决方案22】:
                              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 
                                   }
                              } 
                              

                              【讨论】:

                              • 现有答案的副本。
                              【解决方案23】:

                              我们可以使用用户定义的函数。首先将 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);
                                  }
                              }
                              

                              【讨论】:

                                【解决方案24】:
                                /**
                                 * Sum of all elements from 1 to 1000
                                 */
                                final int sum = Stream.iterate(1, n -> n + 1).limit(1000).mapToInt(el -> el).sum();
                                

                                【讨论】:

                                  【解决方案25】:

                                  这里的大部分答案都是使用内置函数-
                                  如果您想了解此问题背后的整个逻辑,这是我的答案:

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

                                  【讨论】:

                                    【解决方案26】:

                                    你可以使用

                                    int sum = IntStream.of(a).sum();
                                    

                                    【讨论】:

                                      【解决方案27】:
                                       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);
                                      
                                           }
                                        } 
                                      

                                      【讨论】:

                                      • 老兄这是 sum=sum+a[i];
                                      【解决方案28】:
                                      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);
                                      
                                          }
                                      
                                      }
                                      

                                      【讨论】:

                                        【解决方案29】:

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

                                        返回或打印总和。

                                        【讨论】:

                                        • 作品:int[] nums = {1,2};最终 int[] sum = {0}; ArrayList list = new ArrayList(); for (int each : nums) { list.add(each); } list.stream().forEach(each -> { sum[0] += each; });
                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2019-11-21
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2015-12-17
                                        相关资源
                                        最近更新 更多