2015-10-19 38 views
6

减少概念在番石榴库中实现?我的意思是我有多重映射:番石榴:如何自定义减少多图?

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

然后,我有一个倍增功能

(a, b) -> a * b 

而且我想要得到以下地图:

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

我该怎么办它在番石榴?

回答

0

最简单的方法看起来像使用流entries()以上的流,并映射功能,它将集合转换为流,并运行适当的reduce()函数。

事情是这样的:

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

我不认为有番石榴减少操作。我想你有两个选择。

如果您使用的是,只需在条目集上进行流式处理,然后将条目收集到一个新地图中,其中groupingByreduce即可。

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,你可以猜测,会按他们的键值项。然后我们通过首先将它们映射到它们的值并最后乘以它们来减小分组的值(它们是Entry<Integer, Integer>) - 为乘法提供1的标识值。


如果您不能使用 ,你可以从你的 Multimap拿回 Map<Integer, Collection<Integer>>Multimaps.asMap和使用 Maps.transformValues

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键和List<Integer>作为值。

您也可以尝试像

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); 

结果: {A = 6,B = 120}

Maps.EntryTransformer

+0

这更像是我期待的。会试试看! –

+0

**不幸的是,这段代码无效。请检查你自己。** –

+0

@DenisKulagin更新了我的完整例如 –