루프하지 않고 Array List의 합계를 얻을 수 있습니까?
?ArrayList
프를를 사용? ???
는 PHP를 합니다.sum(array)
이데올로기 때문에
PHP 코드는 다음과 같습니다.
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
자바에서도 같은 작업을 하고 싶었습니다.
List tt = new ArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
Java-8이 출시되면(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
다음과 같은 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)
가장 확실한 방법은 다음과 같습니다.
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();
}
맵 함수에 대해 알고 있다면 맵은 재귀 루프 또는 재귀 루프일 수도 있습니다.그러나 각 요소에 도달해야 합니다.그래서 Java 8은 구문이 일치하지 않지만 매우 짧은 것을 원했기 때문에 해결할 수 없었습니다.
int sum = 0
for (Integer e : myList) sum += e;
레퍼런스를 수 .reduce(Integer::sum)
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);
목록에 모든 유형의 개체를 포함할 수 있는 경우 모든 요소를 합산할 수 있는 기본 제공 메서드는 없습니다.다음과 같은 작업을 수행할 수 있습니다.
int sum = 0;
for( Integer i : ( ArrayList<Integer> )tt ) {
sum += i;
}
또는 ArrayList에서 상속받지만 위의 코드를 구현하는 sum()이라는 메서드를 구현하는 독자적인 컨테이너 유형을 만들 수도 있습니다.
ArrayList는 요소의 집합(목록 형식)이며 프리미티브는 래퍼 클래스 객체로 저장되지만 동시에 String 클래스의 객체도 저장할 수 있습니다.SUM은 그 점에서 말이 되지 않을 것이다.그런데 왜 루프(확장 또는 반복기 사용)에 사용하는 것을 그렇게 두려워합니까?
또는 Groovy로 전환하면 컬렉션에 sum() 함수가 있습니다.[1,2,3,4,5,6].sum()
http://groovy.codehaus.org/JN1015-Collections
Java 클래스와 동일한 JVM에서 실행됩니다.
이 링크는 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"
TIntList tt = new TIntArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
int sum = tt.sum();
언급URL : https://stackoverflow.com/questions/5963847/is-there-possibility-of-sum-of-arraylist-without-looping
'itsource' 카테고리의 다른 글
MySQL: 오류 코드: 1118 행 크기가 너무 큽니다(> 8126).일부 열을 TEXT 또는 BLOB로 변경 (0) | 2022.11.05 |
---|---|
JavaScript에서 "assert"란 무엇입니까? (0) | 2022.11.05 |
특정 클래스가 있는 가장 가까운 상위 요소 찾기 (0) | 2022.11.05 |
이클립스는 시작되지 않고 난 아무것도 바꾸지 않았어 (0) | 2022.11.05 |
React Native의 컴포넌트에 줄 바꿈을 삽입하려면 어떻게 해야 합니까? (0) | 2022.11.05 |