質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

6632閲覧

二つのMapをStreamで結合させたい。

Yux

総合スコア30

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/11/22 07:15

編集2018/11/22 08:25

前提・実現したいこと

現在java8のStreamAPIの勉強をしていて解決しない問題が発生したのでこちらの場で意見を貰いたく質問させていただきます。

複数のMap<String, UserData>をMap<String, Map<String, UserData>>という形にしたいです。

java

1Map<String, UserData> objA = new HashMap<String, UserData>() { 2 { 3 put("1", userData1) 4 put("2", userData2) 5 put("3", userData3) 6 put("4", userData4) 7 } 8} 9Map<String, UserData> objB = new HashMap<String, UserData>() { 10 { 11 put("1", userData5) 12 put("2", userData6) 13 put("3", userData7) 14 put("4", userData8) 15 } 16} 17Map<String, UserData> objC = new HashMap<String, UserData>() { 18 { 19 put("1", userData9) 20 put("2", userData10) 21 put("3", userData11) 22 put("4", userData12) 23 } 24} 25Map<String, UserData> objD = new HashMap<String, UserData>() { 26 { 27 put("1", userData13) 28 put("2", userData14) 29 put("3", userData15) 30 put("4", userData16) 31 } 32} 33 34// 上記を下のように結合させたい。 35{ 36 1= 37 {objA=userData1, objB=userData5, objC=userData9, objD=userData13} 38 , 2= 39 {objA=userData2, objB=userData6, objC=userData11, objD=userData14} 40 , 3= 41 {objA=userData3, objB=userData7, objC=userData12, objD=userData15} 42 , 4= 43 {objA=userData4, objB=userData8, objC=userData13, objD=userData16} 44} 45 46// これらのキーはそれぞれのobjの中のキー 47[1, 2, 3, 4] 48// これらのキーは外にある定数 49[objA, objB, objC, objD]

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/11/22 07:36

これだとMap<String, Map<Map<String, UserData>, UserData>>ですが…?
Yux

2018/11/22 08:26

わかりづらくてすみません、割愛していた部分を修正したのですが、これで形式はあっていますでしょうか?
guest

回答1

0

ベストアンサー

Collectors.groupingBy(...)が使えそうです。

以下デモコードですがUserDataなどが元質問に存在しないため、その辺りは適当に作っているので注意してください。

Java

1import java.util.*; 2import java.util.stream.*; 3import static java.util.stream.Collectors.*; 4 5public class StreamMapTest { 6 public static void main(String[] args) { 7 Map<String, UserData> objA = new HashMap<String, UserData>() { 8 { 9 put("1", new UserData("objA", "userData1")); 10 put("2", new UserData("objA", "userData2")); 11 put("3", new UserData("objA", "userData3")); 12 put("4", new UserData("objA", "userData4")); 13 } 14 }; 15 Map<String, UserData> objB = new HashMap<String, UserData>() { 16 { 17 put("1", new UserData("objB", "userData5")); 18 put("2", new UserData("objB", "userData6")); 19 put("3", new UserData("objB", "userData7")); 20 put("4", new UserData("objB", "userData8")); 21 } 22 }; 23 Map<String, UserData> objC = new HashMap<String, UserData>() { 24 { 25 put("1", new UserData("objC", "userData9")); 26 put("2", new UserData("objC", "userData10")); 27 put("3", new UserData("objC", "userData11")); 28 put("4", new UserData("objC", "userData12")); 29 } 30 }; 31 Map<String, UserData> objD = new HashMap<String, UserData>() { 32 { 33 put("1", new UserData("objD", "userData13")); 34 put("2", new UserData("objD", "userData14")); 35 put("3", new UserData("objD", "userData15")); 36 put("4", new UserData("objD", "userData16")); 37 } 38 }; 39 40 Map<String, Map<String, UserData>> map = Stream.of(objA, objB, objC, objD) 41 .map(Map::entrySet).flatMap(Set::stream) 42 .collect(groupingBy( 43 Map.Entry::getKey, 44 mapping( 45 Map.Entry::getValue, 46 toMap(UserData::getType, v -> v, (u, v) -> v, LinkedHashMap::new)))); 47 System.out.println(map); 48 } 49 50} 51 52class UserData { 53 private final String type; 54 private final String name; 55 UserData(String type, String name) { 56 this.type = type; 57 this.name = name; 58 } 59 public String getType() { 60 return type; 61 } 62 @Override public String toString() { 63 return name; 64 } 65}

投稿2018/11/22 10:05

aterai

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yux

2018/11/28 09:03

返事遅れてすみません。上記のコード大変参考になりました。 Collectors.groupingBy(...)を活用することによりスッキリしました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問