是否有可能没有循环的ArrayList的总和

时间:2011-05-11 11:58:48

标签: java

是否有可能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);

13 个答案:

答案 0 :(得分:119)

结束后(2014年3月),您将能够use streams

如果您有List<Integer>

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

如果是int[]

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

答案 1 :(得分:17)

然后自己写一下:

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

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

     return sum;
}

答案 2 :(得分:9)

编写像

这样的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)

答案 3 :(得分:8)

使用循环的唯一选择是使用递归。

您可以定义类似

的方法
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

答案 4 :(得分:3)

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.

答案 5 :(得分:1)

您可以使用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();
}

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

鉴于列表可以包含任何类型的对象,没有内置方法允许您对所有元素求和。你可以这样做:

int sum = 0;

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

或者你可以创建自己的容器类型,它继承自ArrayList,但也实现了一个名为sum()的方法,它实现了上面的代码。

答案 8 :(得分:0)

ArrayList是 Collection 元素(以列表的形式),原语存储为包装类对象,但同时我也可以存储String类的对象。 SUM在这方面没有意义。 BTW为什么如此害怕使用for循环(增强或通过迭代器)呢?

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

这个link显示了如何在java中求和的三种不同方法,有一个选项在以前的答案中没有使用Apache Commons 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

答案 11 :(得分:0)

您可以使用GNU Trove库:

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

答案 12 :(得分:0)

这可以通过使用方法引用reduce(Integer::sum)的reduce来完成:

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

或者没有Optional

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