有没有循环ArrayList的总和的可能性

有没有循环ArrayList的总和的可能性?

PHP提供sum(array) ,它将给出数组的总和。

PHP代码就像

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

我想在Java中做同样的事情:

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

一旦java-8发布(2014年3月),您将可以使用stream:

如果你有一个List<Integer>

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

如果它是一个int[]

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

然后自己写:

 public int sum(List<Integer> list) { int sum = 0; for (int i : list) sum = sum + i; return sum; } 

编写一个util函数

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

然后使用像

 int sum = ListUtil.sum(yourArrayList) 

使用循环的唯一select是使用recursion。

你可以定义一个类似的方法

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

与使用简单循环相比,这是非常低效的,如果列表中有许多元素,就会炸毁。

避免堆栈溢出的替代方法是使用。

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

这同样低效,但是会避免堆栈溢出。


写同样的东西的最短的方法是

 int sum = 0, a[] = {2, 4, 6, 8}; for(int i: a) { sum += i; } System.out.println("sum(a) = " + sum); 

版画

 sum(a) = 20 

对我来说,最清晰的方法是:

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

要么

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

它也使用内部循环,但没有循环是不可能的。

鉴于一个列表可以容纳任何types的对象,没有内置的方法可以让你总结所有的元素。 你可以做这样的事情:

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

或者,您可以创build自己的容器types,它inheritance自ArrayList,但也实现了一个名为sum()的方法,它实现了上面的代码。

ArrayList是元素的集合(以list的forms),primitive被存储为包装类对象,但同时我也可以存储String类的对象。 SUM在这方面没有任何意义。 顺便说一句,为什么这么害怕用循环(增强或通过迭代器)?

或切换到Groovy,它有一个集合sum()函数。 [1,2,3,4,5,6]的.sum()

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

在与java类相同的JVM上运行。

这个链接显示了三种不同的方式如何总结在java中,有一个选项是不是在以前的答案使用Apache共享math..

例:

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

参见StatUtils api

你可以使用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; } } 

然后使用这个闭包如下所示:

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

如果你知道map函数,那么你知道一个map也是可以recursion循环或recursion循环的。 但显然你必须达到每个元素。 所以,我不能解决Java 8,因为一些语法不匹配,但想要很短,所以这就是我得到的。

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

你可以使用GNU Trove库:

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