Is there possibility of sum of ArrayList without looping

Java

Java Problem Overview


Is there possibility of sum of ArrayList without looping?

PHP provides sum(array) which will give the sum of array.

The PHP code is like

$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";

I wanted to do the same in Java:

List tt = new ArrayList();
tt.add(1);
tt.add(2);
tt.add(3);

Java Solutions


Solution 1 - Java

Once [tag:java-8] is out (March 2014) you'll be able to use streams:

If you have a List<Integer>

int sum = list.stream().mapToInt(Integer::intValue).sum();

If it's an int[]

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

Solution 2 - Java

Then write it yourself:

public int sum(List<Integer> list) {
     int sum = 0; 

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

     return sum;
}

Solution 3 - Java

The only alternative to using a loop is to use recursion.

You can define a method like

public static int sum(List<Integer> ints) {
   return ints.isEmpty() ? 0 : ints.get(0) + ints.subList(1, ints.length());
}

This is very inefficient compared to using a plain loop and can blow up if you have many elements in the list.

An alternative which avoid a stack overflow is to use.

public static int sum(List<Integer> ints) {
    int len = ints.size();
    if (len == 0) return 0;
    if (len == 1) return ints.get(0);
    return sum(ints.subList(0, len/2)) + sum(ints.subList(len/2, len));
}

This is just as inefficient, but will avoid a stack overflow.


The shortest way to write the same thing is

int sum = 0, a[] = {2, 4, 6, 8};

for(int i: a) {
    sum += i;
}

System.out.println("sum(a) = " + sum);

prints

sum(a) = 20

Solution 4 - Java

Write a util function like

public class ListUtil{

    public static int sum(List<Integer> list){
      if(list==null || list.size()<1)
        return 0;
      
      int sum = 0;
      for(Integer i: list)
        sum = sum+i;
    
      return sum;
    }
}

Then use like

int sum = ListUtil.sum(yourArrayList)

Solution 5 - Java

for me the clearest way is this:

doubleList.stream().reduce((a,b)->a+b).get();

or

doubleList.parallelStream().reduce((a,b)->a+b).get();

It also use internal loops, but it is not possible without loops.

Solution 6 - Java

You can use apache commons-collections API.

class AggregateClosure implements org.apache.commons.collections.Closure {
		int total = 0;

		@Override
		public void execute(Object input) {
			if (input != null) {
				total += (Integer) input;
			}
		}

		public int getTotal() {
			return total;
		}
	}

Then use this closure as shown below:

public int aggregate(List<Integer> aList) {
        AggregateClosure closure = new AggregateClosure();
        org.apache.commons.collections.CollectionUtils.forAllDo(aList, closure);
        return closure.getTotal();
}

Solution 7 - Java

If you know about the map function, then you know that a map is also can be recursive loop or recursive loop. But obviously you have to reach each element for that. so, I could not work out the Java 8, because some syntax mismatch but wanted a very short so this is what I got.

int sum = 0
for (Integer e : myList) sum += e;

Solution 8 - Java

This can be done with reduce using method references reduce(Integer::sum):

Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4)
        .stream()
        .reduce(Integer::sum)
        .get();

Or without Optional:

Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4)
        .stream()
        .reduce(0, Integer::sum);

Solution 9 - Java

Given that a list can hold any type of object, there is no built in method which allows you to sum all the elements. You could do something like this:

int sum = 0;

for( Integer i : ( ArrayList<Integer> )tt ) {
  sum += i;
}

Alternatively you could create your own container type which inherits from ArrayList but also implements a method called sum() which implements the code above.

Solution 10 - Java

ArrayList is a Collection of elements (in the form of list), primitive are stored as wrapper class object but at the same time i can store objects of String class as well. SUM will not make sense in that. BTW why are so afraid to use for loop (enhanced or through iterator) anyways?

Solution 11 - Java

Or switch to Groovy, it has a sum() function on a collection. [1,2,3,4,5,6].sum()

http://groovy.codehaus.org/JN1015-Collections

Runs on the same JVM as your java classes.

Solution 12 - Java

This link shows three different ways how to sum in java, there is one option that is not in previous answers using Apache Commons Math..

Example:

public static void main(String args []){
    List<Double> NUMBERS_FOR_SUM = new ArrayList<Double>(){
         {
            add(5D);
            add(3.2D);
            add(7D);
         }
    };
    double[] arrayToSume = ArrayUtils.toPrimitive(NUMBERS_FOR_SUM
            .toArray(new Double[NUMBERS_FOR_SUM.size()]));    
    System.out.println(StatUtils.sum(arrayToSume));

}

See StatUtils api

Solution 13 - Java

You can use GNU Trove library:

TIntList tt = new TIntArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
int sum = tt.sum();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTapsiView Question on Stackoverflow
Solution 1 - JavamsayagView Answer on Stackoverflow
Solution 2 - JavaErhan BagdemirView Answer on Stackoverflow
Solution 3 - JavaPeter LawreyView Answer on Stackoverflow
Solution 4 - JavaNishantView Answer on Stackoverflow
Solution 5 - JavaJán ЯabčanView Answer on Stackoverflow
Solution 6 - JavaHari SamalaView Answer on Stackoverflow
Solution 7 - JavasiviView Answer on Stackoverflow
Solution 8 - JavalczapskiView Answer on Stackoverflow
Solution 9 - JavaMike KwanView Answer on Stackoverflow
Solution 10 - JavaGauravJView Answer on Stackoverflow
Solution 11 - JavadbrinView Answer on Stackoverflow
Solution 12 - JavanachokkView Answer on Stackoverflow
Solution 13 - JavayurezView Answer on Stackoverflow