의 합이 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);
의 합이 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);
array_sum는 내부적으로 루프를 수행하며 사용자에게 숨 깁니다.
답변:
그런 다음 직접 작성하십시오.
public int sum(List<Integer> list) {
int sum = 0;
for (int i : list)
sum = sum + i;
return sum;
}
int. 여기서 Integer자바의 자동 복싱 기능 을 사용 하는 것은 가치가 거의 없습니다 . 또한 유형 Integer이기 때문에 매번 잠재적으로 많은 새 객체를 만들고 재생성 Immutable합니다.
루프를 사용하는 유일한 대안은 재귀를 사용하는 것입니다.
다음과 같은 방법을 정의 할 수 있습니다.
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();
}
또는 Groovy로 전환하면 컬렉션에 sum () 함수가 있습니다. [1,2,3,4,5,6] .sum ()
http://groovy.codehaus.org/JN1015-Collections
Java 클래스와 동일한 JVM에서 실행됩니다.
Java되어 있으므로 기술적으로 유효한 답변이 아닙니다.
이 링크 는 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 참조
ArrayList"완성 가능한"내용이 포함되어 있지 않으면 어떻게합니까? ArrayList와 배열이 반드시 같은 것은 아닙니다. 배열의 숫자를 합산하는 것은 요소에 대한 매우 간단한 for 루프이고 누적 합계를 계산하는 것입니다.