2012-06-27 5 views
1

두지도의 값을 합산하고 구아바를 사용하여 합계 값으로지도를 반환하려면 어떻게해야합니까? 안전하게 가정 할 수 있습니다. 두 맵은 동일한 키 세트를 갖습니다.두지도의 값을 합산하고 구아바를 사용하여 값을 반환하는 방법

예를 들어

:

Map<OccupancyType, BigDecimal> filteredPrice 
[ 1 : 100 ] 
[ 2 : 50 ] 
[ 3 : 200 ] 

다른지도

Map<OccupancyType, BigDecimal> pkgPrice 
[ 1 : 10 ] 
[ 2 : 20 ] 
[ 3 : 30 ] 

Map<OccupancyType, BigDecimal> sumPrice 
[ 1 : 110 ] 
[ 2 : 70 ] 
[ 3 : 230 ] 

가 나는이지도를 통해 반복하고 쉽게 값을 요약 할 수 있습니다 알고 짓게되는지도 만이 거기에 구아바 메서드 중 하나를 사용하여 이것을 수행하는 더 깨끗한 방법?

답변

4

구아바 기여자는 여기에 있습니다. 당신이 두지도는 동일한 키가 확인을 경우

, 당신이

Maps.transformEntries(pkgPrice, 
    new EntryTransformer<OccupancyType, BigDecimal, BigDecimal>() { 
    public BigDecimal transformEntry(OccupancyType key, BigDecimal pkPrice) { 
    return pkPrice.add(filteredPrice.get(key)); 
    } 
}); 

하지만 그렇게 말을 할 수 가정 ,이 또한 ("the direct approach is the cleanest."의 범주에 정면으로 떨어질 것으로 보인다, 이 구현은 복사본을 작성하지 않는 한 요청할 때마다 값을 다시 계산하지만 여전히 거의 불필요하게 복잡하므로 직접적인 명령 방식이 여기에서 거의 확실합니다.

+0

고마워요! 나는'직접 접근법 (direct approach) '을 앞두고 당신의 답을 답으로 표시하고 싶습니다. 그러나, 그렇게함으로써 나는 transformEntries (...)를 생각하고 사용하도록 누군가를 오도하고 싶지는 않습니다. 우리가 여기서 어떻게 할 수 있을지에 대한 아이디어가 있습니까? – brainydexter

+0

또한, 이것을 자세히 설명 할 수 있습니까? 또한,이 구현은 복사 할 때까지 요청할 때마다 값을 다시 계산합니다. 참조 링크를 공유해 주시면 감사하겠습니다. – brainydexter

+1

'sumPrice'를 위 메소드를 사용하여 계산 된 맵으로 설정하면'sumPrice.get (key) '를 두 번 이상 호출하면 매번 sum이 다시 계산됩니다. 'Maps.transformEntries'는 복사본이 아닌 _view_를 반환합니다. 즉, 반환 된 맵에 대한 쿼리가 백업 맵을 통해 읽고 다시 계산됩니다. –

1

functionaljava :

지도에 monoid 인스턴스를 정의 할 수 있습니다.

public static <K, V> Monoid<Map<K, V>> mapMonoid(final Monoid<V> valueMonoid) { 
    return new Monoid<Map<K, V>>(

    // associative binary operation 
    new F2<Map<K, V>, Map<K, V>, Map<K, V>>() { 
     public Map<K, V> f(Map<K, V> m1, Map<K, V> m2) { 
     // logic for merging two maps 
     } 
    }, 

    // identity 
    new HashMap<K, V>() 
); 
} 

을 (. 놀랐 this is not already present in the library입니다) 그리고 이렇게 사용 :

Map<Integer, Integer> mergedMap = 
    mapMonoid(Monoid.intAdditionMonoid).sum(m1, m2); 

이 방법을 수행 할 수 있습니다 심지어 지도의 목록을 표시합니다.

List<Map<Integer, Integer>> maps = /* list of maps */; 
Map<Integer, Integer> total = 
    mapMonoid(Monoid.intAdditionMonoid).sumLeft(maps); 
관련 문제