有没有循环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();