亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

地圖<X, 地圖<Y, Z> 到地圖<Y, 地圖<X, Z>

地圖<X, 地圖<Y, Z> 到地圖<Y, 地圖<X, Z>

largeQ 2023-03-31 09:18:34
我想切換地圖的鍵和其中的地圖:Map<X, Map<Y, Z> -> Map<Y, Map<X, Z>我試過使用流,但無法創建內部映射或如何分別從原始內部映射訪問鍵和值。//到目前為止我已經嘗試過:originalMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
查看完整描述

2 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

有點復雜,但它有效:


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(其中每個內部Map只有一個Entry),并使用具有合并功能的收集器合并與相同外部鍵對應的toMap內部s 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);

將輸出:


{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}}

編輯:


如果您使用的是 Java 9 或更高版本,您可以使用Map.of它來稍微簡化代碼:


Map<Y,Map<X,Z>> out =

      originalMap.entrySet()

                 .stream()

                 .flatMap(e -> e.getValue()

                                .entrySet()

                                .stream()

                                .map(e2 -> new SimpleEntry<>(e2.getKey(),Map.of(e.getKey(),e2.getValue()))))

                 .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));



查看完整回答
反對 回復 2023-03-31
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

對我來說,實際上,沒有流,這要容易得多;但仍在使用 java-8 功能(示例取自其他答案):


    Map<Integer, Map<String, Double>> result = new HashMap<>();


    originalMap.forEach((key, value) -> {

        value.forEach((innerKey, innerValue) -> {


            Map<String, Double> map = new HashMap<>();

            map.put(key, innerValue);


            result.merge(innerKey, map, (left, right) -> {

                left.putAll(right);

                return left;

            });

        });

    });


    System.out.println(result);


查看完整回答
反對 回復 2023-03-31
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號