Javaで配列内のすべての数値の合計をどのようにして見つけますか?


141

Javaで配列内のすべての整数の合計を見つけるのに問題があります。Mathこのためのクラスで有用なメソッドを見つけることができません。


15
独自のコードを記述してください。コードは2〜3行です。
wkl

2
残念ながら、上記(および以下)の「答え」は「The Java Way」です:-/ 関数型Javaライブラリを使用できますが、Java構文を処理するのは非常に面倒です。

1
私はこの質問が非常に古いことを知っていますが、以下のmsayagによる回答は、受け入れられた回答としてマークする必要があるようです。
松Q.16年

あなたが自分で書くことの問題は、それがループであることです。3つの数字の合計を取ると、1つの命令で実行できるはずです。
Al Gジョンストン

回答:


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

5
その場合、long sum = IntStream.of(a).asLongStream()。sum();としてLongStreamを使用できます。または長い合計= LongStream.of(a).sum();
msayag

2
ストリームを使用することで速度にかなりの利点はありますか?
mvorisek 2016

1
合計が長く収まらない場合は、ペアで賢く合計(除算と征服)する必要があります。小さいBigDecimalを合計する方が速いためです。
user482745 2018

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

48

Java 8を使用している場合、Arraysクラスは、指定された配列でstream(int[] array)シーケンシャルを返すメソッドを提供IntStreamしますintdoublelong配列に対してもオーバーロードされています。

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として、入力として数値を含むa を作成できます。合計したい場合は、次のようにします。

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

35

これは、標準のJava APIにはない(AFAIK)単純なものの1つです。自分で書くのは簡単です。

他の答えは完全に問題ありませんが、ここにfor-each構文糖度があるものがあります。

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

しかし、これは一挙にすべての数値を追加するわけではありません。非効率的です。
Al Gジョンストン

20

できません。他の言語には、PHPのarray_sum()のようないくつかのメソッドがありますが、Javaにはありません。

ただ…

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

System.out.println(sum);

6
.NET Sum(IEnumerable <Int32>)msdn.microsoft.com/en-us/library/…が
山本晶


13

以前のソリューションに追加する唯一のポイントは、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;

6
int sum = 0;

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

4
for-eachループ(Java 1.5で導入)を使用すると、さらに快適になります。
wkl

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

sum関数は、fills、sort、search、copy、equalsが有効な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 2017

2

自分でロールバックする必要があります。
合計は0から始めます。次に、配列内のすべての整数を考慮して、合計に追加します。次に、整数が足りなくなると、合計になります。

整数がない場合、合計は0です。


2

この演習から学ぶことは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;
}

2

場合によります。いくつの数字を追加しますか?上記の提案の多くをテストします。

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

1

underscore-javaライブラリにはsum()メソッドがあります。

コード例:

import com.github.underscore.lodash.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
    }
}

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

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 2016

0

ユーザー定義関数を使用する場合があります。最初に合計変数をゼロに初期化します。次に、配列を走査し、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

上記の答えはどれも、スレッドプールを使用すると数倍速くなるとは考えていません。ここで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でパフォーマンスが向上します。詳細は私の長い投稿を参照してください。
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 2017年

-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以降ラムダ式の使用が可能になりました。

これを見てください:

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(each-> {sum [0] + = each;});
Zhurov Konstantin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.