2015-10-19 14 views
6

kavramı, Guava libs uygulamasında uygulandı mı? SonraGuava: Bir multimapı özel olarak nasıl düşürürüm?

[1] -> 1, 2, 5, 8 
[2] -> 3, 6, 4 
[3] -> 1, 0 

Ben çarparak işlevi var:

(a, b) -> a * b 

Ve şu haritayı almak istiyorum: Ben yapacağım nasıl

[1] -> 80   // 1 * 2 * 5 * 8 
[2] -> 72   // 3 * 6 * 4 
[3] -> 0   // 1 * 0 

Ben Multimap anlamına Guava'da mı?

cevap

0

En kolay yol, entries() üzerinden bir akış kullanmak ve koleksiyonun bir akıma dönüştüren ve bunun üzerinden uygun bir reduce() işlevini çalıştıran bir işlevi eşlemek gibi görünüyor. Böyle

şey: Ben Guava bir azalma işlem yapılmazsa sanmıyorum

HashMap<Integer, Integer> collected = 
    mmap.entries().stream().collect(HashMap::new, 
      (map, e) -> { 
       map.put(e.getKey(), e.getValue().stream().reduce((a, b) -> (a * b)).get()); 
      }, HashMap::putAll); 
5

. Sanırım iki seçeneğin var.

kullanıyorsanız, yalnızca giriş kümesinin üzerine akıtın ve girişleri groupingBy ve reduce ile yeni bir haritaya toplayın.

import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.mapping; 
import static java.util.stream.Collectors.reducing; 

... 

Map<Integer, Integer> map = 
    multimap.entries() 
      .stream() 
      .collect(groupingBy(Map.Entry::getKey, 
           reducing(1, Map.Entry::getValue, (a, b) -> a * b))); 

groupingBy Tahmin edebileceğiniz gibi, onların anahtar değerleriyle olacak grup girişleri. Daha sonra, gruplandırılmış değerleri (Entry<Integer, Integer>) ilk önce değerlerini haritalayarak ve son olarak bunları çarparak - çarpma için 1 olan kimlik değerini sağlayarak azaltırız. Eğer kullanamıyorsanız


, sen Multimaps.asMap ile senin Multimap bir Map<Integer, Collection<Integer>> geri almak ve Maps.transformValues kullanabilirsiniz:

Map<Integer, Collection<Integer>> tempMap = Multimaps.asMap(oldMap); 
Map<Integer, Integer> newMap = 
    Maps.transformValues(tempMap, new Function<Collection<Integer>, Integer>() { 
      @Nullable 
      @Override 
      public Integer apply(Collection<Integer> input) { 
       //do the multiplication here 
       return 0; 
      } 
     }); 
1

String anahtar ve değerleri olarak List<Integer> kullanılır.

Ayrıca

Map<String, List<Integer>> test = new HashMap<String, List<Integer>>(); 
    test.put("a", Lists.newArrayList(1, 2, 3)); 
    test.put("b", Lists.newArrayList(4, 5, 6)); 

    Map<String, Integer> transformEntries = Maps.transformEntries(test, new EntryTransformer<String, List<Integer>, Integer>() { 

     @Override 
     public Integer transformEntry(String key, List<Integer> values) { 
      Integer a = 1; 
      for (Integer value : values) { 
       a = value * a; 
      } 
      return a; 
     } 
    }); 

    System.out.println(transformEntries); 

Sonuç gibi bir şey deneyebilirsiniz: {a = 6, b = 120}

daha ben ne arıyorum gibi

Maps.EntryTransformer

+0

. Bir deneyecek! –

+0

** Maalesef bu kod çalışmıyor. Lütfen, kendinize bir bakın. ** –

+0

@DenisKulagin, örneğin –

İlgili konular