[java] 반복하지 않고 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);



답변

한번 출시되었습니다 (2014 년 3 월) . 스트림사용할 수 있습니다 .

당신이 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;
}


답변

루프를 사용하는 유일한 대안은 재귀를 사용하는 것입니다.

다음과 같은 방법을 정의 할 수 있습니다.

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


답변

다음과 같은 유틸리티 함수를 작성하십시오.

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)


답변

나에게 가장 명확한 방법은 다음과 같습니다.

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

또는

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

내부 루프도 사용하지만 루프 없이는 불가능합니다.


답변

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 함수에 대해 알고 있다면 맵이 재귀 루프 또는 재귀 루프 일 수도 있음을 알고 있습니다. 그러나 분명히 당신은 그것을 위해 각 요소에 도달해야합니다. 그래서 일부 구문이 일치하지 않지만 매우 짧은 것을 원했기 때문에 Java 8을 해결할 수 없었습니다.

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