如何两个数组合并到使用Java流的地图吗?

问题描述 投票:6回答:2

让我们假设,我们得到以下两个数组

String[] keys   = new String[] {"a", "b", "c", "aa", "d", "b"}
int[]    values = new int[]    { 1 ,  2 ,  3 ,  4  ,  5 ,  6 }

而通过合并这两个数组到哈希表我们得到以下

// pseudo-code
Map<String, Integer> dictionary = new HashTable<>(
  ("a"  => 1)
  ("b"  => 8) // because "b" appeared in index 1 and 5
  ("c"  => 3)
  ("aa" => 4)
  ("d"  => 5)
);

我们怎样才能做到这一点使用Java LAMBDA风格?

到目前为止,我有以下几点:

// this loops through the range given (used for index start and end)
// and sums the values of duplicated keys
tree.listMap = IntStream.range(range[0], range[1]).boxed().collect(
  Collectors.toMap(i - > dictionary[i], i - > i + 1, Integer::sum, TreeMap::new)
);

不过,我想带2个阵列,通过键和值,其中值是重复键的所有值的总和合并。我们应该怎么做?

java arrays lambda hashtable java-stream
2个回答
6
投票

你去那里:

Map<String,Integer> themap = 
       IntStream.range (0, keys.length).boxed()
                .collect (Collectors.toMap(i->keys[i],
                                           i->values[i],
                                           Integer::sum,
                                           TreeMap::new));

输出:

{a=1, aa=4, b=8, c=3, d=5}

这非常类似于您发布,但是,出于某种原因,您发布的片断不包含参考keysvalues阵列的片段。


3
投票

我不喜欢引用索引时使用流,但你可以使用groupingBysummingInt来实现:

Map<String, Integer> result = IntStream.range(0, keys.length)
   .boxed()
   .collect(
       Collectors.groupingBy(
           i -> keys[i],
           Collectors.summingInt(i -> values[i])
       )
   );

需要注意的是这个工程的假设是键和值都是相等的长度,所以你可能需要做一些额外的验证。

© www.soinside.com 2019 - 2024. All rights reserved.