Java 배열에서 모든 숫자의 합계를 어떻게 찾습니까?


141

Java 배열의 모든 정수 합계를 찾는 데 문제가 있습니다. Math클래스 에서 유용한 메소드를 찾을 수 없습니다 .


15
직접 작성하십시오. 코드는 2-3 줄입니다.
wkl

2
불행히도 위의 (그리고 다음) "답변"은 "The Java Way"입니다 :-/ Functional Java library를 사용할 수 있지만 Java 구문을 다루는 것은 번거 롭습니다.

1
나는이 질문이 매우 오래 되었다는 것을 알고 있지만 아래의 msayag대답 은 허용되는 답변으로 표시되어야하는 것처럼 보입니다.
Matsu Q.

자신의 글을 쓰는 데있어 문제는 루프라는 것입니다. 3 개의 숫자를 합하면 하나의 명령으로 수행 할 수 있습니다.
Al G Johnston

답변:


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
배열에 큰 숫자가 포함되어 있고 합계가 범위를 벗어나면 어떻게됩니까?
thanhbinh84

5
이 경우 Long sum을 사용할 수 있습니다. long sum = IntStream.of (a) .asLongStream (). sum (); 또는 long sum = LongStream.of (a) .sum ();
msayag

2
스트림을 사용할 때 상당한 속도 이점이 있습니까?
mvorisek

1
합계가 길지 않으면 작은 BigDecimals를 합산하는 것이 빠르기 때문에 쌍을 현명하게 나누어야합니다 (나누기 및 정복).
user482745

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

48

Java 8을 사용하는 경우 Arrays클래스는 지정된 배열 stream(int[] array)로 순차적을 반환하는 메소드를 제공합니다 . 또한 과부하되었습니다 및 배열.IntStreamintdoublelong

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

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

그러나 이것은 한 번에 모든 숫자를 추가하지는 않습니다. 비효율적입니다.
Al G Johnston

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/…를
Akira Yamamoto

15

아파치 수학 : 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

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

imho sum 함수는 fill, 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

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

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 코어, 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

1

밑줄-자바 라이브러리 에는 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

0

사용자 정의 함수를 사용할 수 있습니다. 처음에 합계 변수를 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
/**
 * 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에서는 포크 조인 스레드 풀을 사용하고 여러 부분에서 스트림을 자동으로 나누고 병렬로 실행 한 다음 병합합니다. 다음 코드 줄만 기억한다면 여러 곳에서 사용할 수 있습니다.

가장 짧고 달콤한 코드에 대한상은 다음과 같습니다.

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

하고 싶고 sum of squaresArrays.stream (nums) .parallel (). map (x-> x * x) .reduce (0, (a, b)-> a + b)한다고 가정 해 봅시다. 아이디어는 맵 없이도 여전히 Reduce를 수행 할 수 있다는 것입니다.


반드시 가장 빠른 것은 아닙니다. 작은 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

-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 [] 숫자 = {1,2}; 최종 int [] 합 = {0}; ArrayList <정수> 목록 = 새 ArrayList <정수> (); for (int each : nums) {list.add (each); } list.stream (). forEach (각각-> {sum [0] + = 각각;});
Zhurov Konstantin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.