itsource

루프하지 않고 Array List의 합계를 얻을 수 있습니까?

mycopycode 2022. 11. 5. 17:29
반응형

루프하지 않고 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);

이 출시되면(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"

GNU Trove 라이브러리를 사용할 수 있습니다.

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

반응형