2014-02-23 5 views
8

저는 Java 8을 가지고 놀고 있습니다. 설명서를 읽는 것이 가능해야한다는 것을 알고 있습니다. 어떻게 할 수 없는지 알고 있습니다.목록으로 변환 <Long>을 <Long, Long> 번으로 집계하십시오.

long factorProduct = LongStream.rangeClosed(1, maxFactor) 
      .filter(this::isOptimalFactor) 
      .reduce((i, j) -> i * j) 
      .getAsLong(); 
    List<Long> primeFactors = primeFactors(factorProduct); 

중요한 부분은 내가 일부 Long 숫자에 중복이 수 List<Long> 것을 가지고있다 :

나는 다음과 같은 작업 코드가 있습니다.

이제 키를 요소로 사용하고 값으로 occurences를 사용하여 Map<Long, Long>으로 변환하고 싶습니다.

Map<Long, Long> primeFactorCount = primeFactors.stream() 
      .collect(Collectors.counting()); 

작동,하지만 그렇지 않습니다 :

나는 생각했다. 나는 예를 찾아 보았다 in the java.util.stream.Collectors documentation.

어떻게 이러한 기능을 사용해야합니까? 당신이 그룹에 요소를 원하는 경우

답변

10

, 당신은 groupingBy를 사용해야합니다 :

import static java.util.stream.Collectors.*; 

Map<Long, Long> primeFactorCount = primeFactors.stream() 
     .collect(groupingBy(p -> p, counting())); 
+0

전에 해봤지만 오류가 발생하여, automaticaly java.util.Map을 가져 오는 것을 잊어 버렸습니다. – skiwi

2

당신이 Eclipse Collections (이전 GS Collections)를 사용하는 경우, 당신은 소인수 목록과 주요 요인 수에 대해 다음을 사용할 수 있습니다. 가방은 기본적으로 Map<K, Integer>입니다.

MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag(); 

위의 primeFactors 방법에서 FastList을 사용하십시오.

Eclipse Collections의 경우 기본 Lists and Bags가 있으므로 결과를 입력하지 않아도됩니다.

LongList primeFactors = this.primeFactors(factorProduct); 
LongBag primeFactorCount = primeFactors.toBag(); 

위의 primeFactors 방법 대신 LongArrayList을 사용하십시오.

참고 : 저는 Eclipse Collections에 대한 커미터입니다.