Как найти сумму всех чисел в массиве в Java?

145

У меня проблема с поиском суммы всех целых чисел в массиве в Java. Я не могу найти Mathдля этого в классе какой-либо полезный метод .

ТомЛисанки
источник
17
Напишите свой, код для этого состоит из 2-3 строк.
wkl
2
К сожалению, приведенные выше (и следующие) «ответы» - это «Путь Java»: - / Вы можете использовать функциональную библиотеку Java , но иметь дело с синтаксисом Java так громоздко.
1
Я знаю, что этот вопрос очень старый, но ответ msayag ниже кажется, что он должен быть отмечен как принятый ответ.
Matsu Q.
Проблема с написанием собственного текста в том, что это цикл. Когда вы берете сумму из 3 чисел, вы должны уметь делать это за одну инструкцию.
Эл Джи Джонстон

Ответы:

272

В вы можете использовать потоки:

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 01
5
В этом случае вы можете использовать LongStream либо как long sum = IntStream.of (a) .asLongStream (). Sum (); или длинная сумма = LongStream.of (a) .sum ();
msayag 06
2
Есть ли значительное преимущество в скорости при использовании потоков?
mvorisek 05
1
Если ваша сумма не умещается в длину, следует суммировать попарно (разделять и властвовать), потому что суммирование меньших BigDecimals быстрее.
user482745
1
@HosseinRahimijava.util.stream.DoubleStream.of(a).sum();
ggorlen
48

Если вы используете Java 8, Arraysкласс предоставляет stream(int[] array)метод, который возвращает последовательность IntStreamс указанным intмассивом. Он также был перегружен doubleи longмассивы.

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. Таким образом, вы можете, например, иметь a, Stringкоторый содержит числа в качестве входных данных, и если вы хотите их суммировать, просто выполните:

int sum = Arrays.stream("1 2 3 4".split("\\s+")).mapToInt(Integer::parseInt).sum();
Алексис С.
источник
35

Это одна из тех простых вещей, которых нет (AFAIK) в стандартном Java API. Достаточно легко написать свой собственный.

Другие ответы прекрасны, но вот один с синтаксическим сахаром для каждого.

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);
    }
}
wkl
источник
Но это не суммирует все цифры одним махом. Это неэффективно.
Al G Johnston
21

Вы не можете. В других языках есть некоторые методы для этого, например array_sum () в PHP, но в 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/…
Акира Ямамото,
15

В Apache Math: есть StatUtils.sum(double[] arr)

фодон
источник
Почему только в статуях: D
Lore
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];
}
Bnjmn
источник
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, функция суммы, казалось бы, хорошо подходит для расширения класса Arrays, где заполнение, сортировка, поиск, копирование и равенство в реальном времени. В документации javadoc скрывается множество удобных методов, так что при переносе Fortran на java будет справедливым вопросом задать вопрос перед развертыванием нашего собственного вспомогательного метода. Поищите в огромном индексе документации javadoc слова «сумма», «добавить» и любые другие ключевые слова, которые вы можете придумать. Вы можете предположить, что кто-то уже сделал это для примитивных типов 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;
}
jsanmarb
источник
1
C-программист, а?
Towi
2

Вы должны сами катить.
Вы начинаете с нуля. Затем вы считаете, что каждое целое число в массиве добавляется к общей сумме. Затем, когда у вас заканчиваются целые числа, у вас есть сумма.

Если бы не было целых чисел, то общая сумма равна 0.

Chustar
источник
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-ядерной машины с Ubuntu18 на 16 Гб цикл был самым быстрым для меньших значений и параллельным для больших. Но, конечно, это будет зависеть от оборудования, которое вы используете:

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

Для этого не существует «метода в математическом классе». Это не похоже на функцию квадратного корня или что-то в этом роде.

Вам просто нужно иметь переменную для суммы и пройти через массив, добавляя каждое найденное вами значение к сумме.

jbx
источник
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

Мы можем использовать определяемую пользователем функцию. Сначала инициализируйте переменную суммы равной нулю. Затем пройдитесь по массиву и добавьте элемент с суммой. Затем обновите переменную суммы.

Фрагмент кода:

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();
Jackkobec
источник
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). Идея в том, что вы все еще можете выполнить сокращение без карты.

сапи
источник
Не обязательно самый быстрый. Loop будет лучше для малых 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
чувак, это сумма = сумма + [я];
Максим Князев
-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);

    }

}
TRC
источник
-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
Работает: int [] nums = {1,2}; заключительный интервал [] сумма = {0}; Список ArrayList <Integer> = новый ArrayList <Integer> (); для (int each: nums) {list.add (каждый); } list.stream (). forEach (каждый -> {сумма [0] + = каждый;});
Журов Константин