将Map <X,Map <Y,Z>映射到Map <Y,Map <X,Z>

时间:2019-07-16 08:19:29

标签: java dictionary collections java-8 java-stream

我想切换地图键和其中的地图:

div

我尝试使用流,但是无法创建内部地图,也无法单独访问原始内部地图中的键和值。

//到目前为止,我已经尝试过:

Map<X, Map<Y, Z> -> Map<Y, Map<X, Z>

2 个答案:

答案 0 :(得分:4)

有点复杂,但是有效:

Map<Y,Map<X,Z>> out =
      originalMap.entrySet()
                 .stream()
                 .flatMap(e -> e.getValue()
                                .entrySet()
                                .stream()
                                .map(e2 -> {
                                    Map<X,Z> m = new HashMap<>();
                                    m.put(e.getKey(),e2.getValue());
                                    return new SimpleEntry<>(e2.getKey(),m);}))
                 .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));

基本上,它将原始Stream条目的Map转换为所需输出Stream的平面条目Map(其中每个内部{{1 }}只有一个Map),并使用具有合并功能的Entry收集器来合并与同一外键对应的内部toMap

例如,使用以下输入Map运行此代码:

Map

将输出:

Map<String,Map<Integer,Double>> originalMap = new HashMap<>();
Map<Integer,Double> inner1 = new HashMap<>();
Map<Integer,Double> inner2 = new HashMap<>();
Map<Integer,Double> inner3 = new HashMap<>();
originalMap.put("aa",inner1);
originalMap.put("bb",inner2);
originalMap.put("cc",inner3);
inner1.put(10,10.0);
inner1.put(20,20.0);
inner1.put(30,30.0);
inner2.put(10,40.0);
inner2.put(20,50.0);
inner2.put(30,60.0);
inner3.put(10,70.0);
inner3.put(20,80.0);
inner3.put(30,90.0);

Map<Integer,Map<String,Double>> out =
    originalMap.entrySet()
               .stream()
               .flatMap(e -> e.getValue()
                              .entrySet()
                              .stream()
                              .map(e2 -> {
                                  Map<String,Double> m = new HashMap<>();
                                  m.put(e.getKey(),e2.getValue());
                                  return new SimpleEntry<>(e2.getKey(),m);}))
               .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));
System.out.println (out);

编辑:

如果您使用的是Java 9或更高版本,则可以使用{20={aa=20.0, bb=50.0, cc=80.0}, 10={aa=10.0, bb=40.0, cc=70.0}, 30={aa=30.0, bb=60.0, cc=90.0}} 来简化代码:

Map.of

答案 1 :(得分:2)

对我来说,实际上没有流就容易多了;但仍使用Java-8功能(该示例取自其他答案):

decodedSignature