teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

978閲覧

2つのMapを要素とするList型を比較して、Key,Valueの組み合わせが一致したらそれに対応するList1行分を取得したい

fgjdnsk

総合スコア2

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2023/07/14 15:26

編集2023/07/15 02:36

0

0

Java初心者です。
こちらに投稿するのも初めてとなりますので、どうかお手柔らかにお願いいたします。
ソースコードについては、冗長な部分や適さない変数名を使用している箇所があるかもしれませんが、何か気が付いた点がありましたら教えて頂けると幸いです。
また、実際のコードを抜粋しておりますので、何かおかしな点があるかもしれません。
詳しい方の意見をいただければと思います。
よろしくお願いいたします。

実現したいこと

2つのMapを要素とするList型があります。(List<Map<String,String>>)
KeyListのList1要素分に格納されているKeyとValueの組み合わせを1つの組み合わせとして、DataListに格納されている値と比較して、一致したら該当のDataListのList1要素分全てのKeyとValueを取得したい。

以下を例にすると、KeyListのList[0] (keyName①,3333)(keyName②,5555)に対して
targetDataListのList[1] (keyName①,3333),(keyName②,5555)で一致しているため、targetDataListのList[1]に格納されているkeyName⓪~keyName⑩とそれに対応するValueを取得する。
さらに、この処理をKeyListのList要素分繰り返して、別のMapを要素とするList型に格納、メソッドの戻り値のデータList<Map<String,String>>として返したい。

■KeyList
List[0]
Map keyName① - > 3333
Map keyName② - > 5555
List[1]
Map keyName① - > 7777
Map keyName② - > 9999

■targetDataList
List[0]
Map keyName⓪ - > 0
Map keyName① - > 1111
Map keyName② - > 2222
Map keyName③ - > 1
...
Map keyName⑩ - > 2
List[1]
Map keyName⓪ - > 0
Map keyName① - > 3333
Map keyName② - > 5555
Map keyName③ - > 1
...
Map key⑩ - > 0

前提

特にないです。

発生している問題・エラーメッセージ

比較をして、1つ目の等しいtargetDataListの行は取得できるのですが、それ以降が正しく取得できないです。

該当のソースコード

Java

1public List<Map<String,String> getResult( 2List<Map<String,String>> keyList, 3List<Map<String,String>> targetDataList){ 4int index; 5boolean isEqual = false; 6boolean isExist = false; 7List<Map<String,String>> resultList = new ArrayList<>(); 8 9//一時的に結果を格納するMap 10Map<String,String> tempMap = new LinkedHashMap<>(); 11 12//KeyListのList1要素分に格納されているのが比較キーとその値 13int keyNum = keyList.get(0).size(); 14 15for(int i = 0;i < keyList.size();i++){ 16 index = 0; 17 for(Map.Entry<String,String> entry1 : keyList.get(i).entrySet()){ 18 isExist = false; 19 for(int j = 0;j < targetDataList.size();j++){ 20 for(Map.Entry<String,String> entry2 : targetDataList.get(j).entrySet()){ 21 if(entry1.getKey().equals(entry2.getKey()) && entry1.getValue().equals(entry.2.getValue))){ 22 index++; 23 isExist = true; 24 break; 25 } 26 } 27 if(isExist == true){ 28 tempMap = targetDataList.get(j); 29 break; 30 } 31 } 32 if(index == keyNum){ 33 isEqual = true; 34 } 35 if(isEqual == true){ 36 resultList.add(tempMap); 37 } 38} 39return resuluList; 40} 41 42

試したこと

試行錯誤した結果、上記のコードになりこれ以上は自分の知識では思いつかないと判断しました。

補足情報

特にないです。

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

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

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

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

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

jimbe

2023/07/14 19:06 編集

>以下を例にすると~ あちこちに書き間違いがあるようで、ご提示のコードも実行出来ません。 なお、 List<Map<String,String>> は "Map 型 List" などというのでは無く "Map を要素とする List 型" です。言い回しによっては伝わらない場合がありますのでご注意を。
fgjdnsk

2023/07/15 02:40 編集

ご指摘いただきありがとうございます。 本文の変数名が統一されていなかったので、修正いたしました。 >なお、 List<Map<String,String>> は "Map 型 List" などというのでは無く "Map を要素とする List 型" です。言い回しによっては伝わらない場合がありますのでご注意を。 確かに「Map型List」は不適切だと思いましたので、タイトルと本文の記載を「Map を要素とする List 型」に変更させていただきました。
guest

回答2

0

ベストアンサー

「キーとバリューがすべて一致するデータをtargetDataListから取得し、resultListに格納する ← この処理をkeyListの件数分繰り返し、resultListをメソッドの戻り値とする。」

実現したいことは以上の認識で正しいでしょうか? であれば以下のような処理になるかと思います。

java

1public List<Map<String, String>> getResult( 2 List<Map<String, String>> keyList, 3 List<Map<String, String>> targetDataList 4) { 5 List<Map<String, String>> resultList = new ArrayList<>(); 6 for (Map<String, String> key : keyList) { 7 for (Map<String, String> data : targetDataList) { 8 boolean match = true; 9 for (Entry<String, String> keyEntry : key.entrySet()) { 10 if (!keyEntry.getValue().equals(data.get(keyEntry.getKey()))) { 11 match = false; 12 break; 13 } 14 } 15 if (match) { 16 resultList.add(data); 17 } 18 } 19 } 20 return resultList; 21}

投稿2023/07/14 19:55

neko_the_shadow

総合スコア2395

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

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

fgjdnsk

2023/07/15 02:52

回答いただき、ありがとうございます。 記載していただいた通りに修正したところ、求める値が正常に取得できました。 本当にありがとうございます。 自分の書いたコードと比較して、勉強させていただきます。
guest

0

Map.entrySet() が返すのは Set ですので、 Set.containsAll() が使えます。

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 List<Map<String,String>> keyList = new ArrayList<>(); 6 { 7 Map<String,String> map = new HashMap<>(); 8 map.put("keyName①", "3333"); 9 map.put("keyName②", "5555"); 10 keyList.add(map); 11 } 12 { 13 Map<String,String> map = new HashMap<>(); 14 map.put("keyName①", "7777"); 15 map.put("keyName②", "9999"); 16 keyList.add(map); 17 } 18 19 List<Map<String,String>> targetList = new ArrayList<>(); 20 { 21 Map<String,String> map = new HashMap<>(); 22 map.put("keyName⓪", "0"); 23 map.put("keyName①", "1111"); 24 map.put("keyName②", "2222"); 25 map.put("keyName③", "1"); 26 map.put("keyName⑩", "2"); 27 targetList.add(map); 28 } 29 { 30 Map<String,String> map = new HashMap<>(); 31 map.put("keyName⓪", "0"); 32 map.put("keyName①", "3333"); 33 map.put("keyName②", "5555"); 34 map.put("keyName③", "1"); 35 map.put("keyName⑩", "0"); 36 targetList.add(map); 37 } 38 39 List<Map<String,String>> resultList = getResult(keyList, targetList); 40 System.out.println(resultList); 41 } 42 43 private static <K,V> List<Map<K,V>> getResult(List<Map<K,V>> keyList, List<Map<K,V>> targetList) { 44 List<Map<K,V>> list = new ArrayList<>(); 45 for(Map<K,V> target : targetList) { 46 Set<Map.Entry<K,V>> targetEntrySet = target.entrySet(); 47 for(Map<K,V> key : keyList) { 48 if(targetEntrySet.containsAll(key.entrySet())) { 49 list.add(target); 50 break; 51 } 52 } 53 } 54 return list; 55 } 56}
[{keyName①=3333, keyName②=5555, keyName⓪=0, keyName⑩=0, keyName③=1}]

投稿2023/07/14 18:58

編集2023/07/14 19:17
jimbe

総合スコア13352

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

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

fgjdnsk

2023/07/15 02:58

回答いただき、ありがとうございます。 このような書き方もあるんですね。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問