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

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

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

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

Q&A

解決済

1回答

491閲覧

Java8でList内の値を入れ直したい

ttpk

総合スコア338

Java

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

0グッド

0クリップ

投稿2022/09/06 12:35

前提

java8でListのデータを入れなおす処理を作成しています

該当のソースコード

Java

1 2 List<A> CheckedAList = new ArrayList<>(); 3 for (A entityA : entityAList) { 4 List<B> entityBList = A.getEntityBList(); 5 for(B entityB : entityBList) { 6 List<C> entityCList = entityB.getEntityCList(); 7 for(C entityC : entityCList){ 8 List<D> entityDList = entityC.getEntityDList(); 9 10 /* entityDListをMemberCodeの値で絞り込む 11 entityAと同じMemberCodeを持つデータのみを 12         filterdEntityDListに入れる */ 13 List<D> filteredEntityDList = entityDList.stream() 14 .filter(item -> item.getMemberCode().equals(entityA.getMemberCode())) 15 .collect(Collectors.toList()); 16 17 entityC.setEntityDList(filteredEntityDList); 18 } 19 entityB.setEntityCList(entityCList); 20 } 21 entityA.setEntityBList(entityBList); 22 CheckedAList.add(entityA); 23 24 } 25

entityAをCheckedAListにaddした時点ではfilteredEntityDList の内容が反映されていることを確認できているのですがA entityA : entityAListのfor文を回すとfilteredEntityDListのデータがなくなり、entityCが持っているEntityDListがnullになってしまいます。
setメソッドでList内の値を入れなおすことは可能でしょうか?

Java

1@Data 2@AllArgsConstructor 3public class B { 4 private List<C>entityCList; 5 6 public void setEntityCList(List<C> entityCList){ 7 this.entityCList = entityCList; 8 } 9} 10 11 12@Getter 13@ToString 14@EqualsAndHashCode 15@Slf4j 16public class C implements Comparable<C> { 17 private List<D> entityDList; 18 19 public void setEntityDList(List<D> 20 entityDList) { 21 this.entityDList = entityDList; 22 } 23 24}

試したこと

entityA.setEntityBList(entityBList);
の部分をentityAの初期化処理に変えてみましたが同じ結果でした

Java

1 A checkedA = new A(eEntity, fEntity, entityBList, EntityBListInEdge); 2

entityAのクラスファイル

Java

1@Data 2public class A { 3 4 public A( 5 EEntity eEntity, 6 FEntity fEntity, 7 List<B> EntityBList) { 8 this(eEntity, fEntity, EntityBList, Collections.emptyList()); 9 } 10 11 public A( 12 EEntity eEntity, 13 FEntity fEntity, 14 List<B> EntityBList, 15 List<B> EntityBListInEdge) { 16 this.a1 = eEntity.getA1(); 17 this.a2 = eEntity.getA2(); 18 this.a3 = eEntity.getA3(); 19 this.a4 = eEntity.getA4(); 20 this.fentity = fEntity; 21 this.entityBList = entityBList; 22 this.entityBListInEdge = entityBListInEdge; 23 } 24 25}

補足情報(FW/ツールのバージョンなど)

Java8
spring boot 2.6.3

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

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

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

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

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

jimbe

2022/09/06 13:16 編集

ごちゃごちゃしている上に(隠ぺいの為に)修正されていてかつコンパイル出来ないコードは、何がしたいのかが分かりません。 動作するコード・データ、その結果および本来欲しい結果をご提示ください。 >entityAをCheckedAListにaddした時点ではfilteredEntityDList の内容が反映されていることを確認できているのですがA entityA : entityAListのfor文を回すとfilteredEntityDListのデータがなくなり、entityCが持っているEntityDListがnullになってしまいます。 その確認はどのように行われたのでしょうか。 もし println 等を入れてでしたら、それらを含んだ状態のコードにしてください。 最悪、その確認方法が間違っている可能性もあります。
ttpk

2022/09/06 16:38

回答をありがとうございます。 100行近いメソッドの処理の一部で、エンティティもそれぞれ約50個ほど項目があるため 関係のある部分だけ移して動くコードを作ろうとしたところ、問題の現象を再現させることができませんでした。 >その確認はどのように行われたのでしょうか。 IntelliJでテストコードを動かし、デバッグ実行で確認しました
jimbe

2022/09/06 17:19 編集

> 問題の現象を再現させることができませんでした。 何かの現象の原因を突き止めるためには、検索範囲を狭めていって現象が発生する/しないの境界を探っていくことを行います。 それにはまずご提示頂くコードで再現することが大前提です。 > デバッグ実行で確認しました ということは変数名レベルで特定して確認したということですね。 変数はそのスコープを抜ければ当然消されます。変数の値が他の変数に設定(コピー)されていれば、元の変数が無くなってもオブジェクトは消えません。 変数のスコープ外まで値を追った所で無意味です。
ttpk

2022/09/07 10:11

nullになる箇所がどこか確認していったところ entityCが一部同じエンティティだったためentityDListが 入れなおされていることが原因だと判明しました。 迅速な回答とコメントをありがとうございました
guest

回答1

0

ベストアンサー

たとえば以下のようなコードにすると

java

1import java.util.Arrays; 2import java.util.List; 3import java.util.stream.Collectors; 4 5public class Main { 6 static class A { 7 private int code; 8 private List<B> entityBList; 9 A(int code, B... datas) { this.code = code; entityBList = Arrays.asList(datas); } 10 //public void setEntityBList(List<B> entityBList) { this.entityBList = entityBList; } 11 public List<B> getEntityBList() { return entityBList; } 12 public Integer getMemberCode() { return code; } 13 } 14 static class B { 15 private List<C> entityCList; 16 B(C... datas) { entityCList = Arrays.asList(datas); } 17 //public void setEntityCList(List<C> entityCList) { this.entityCList = entityCList; } 18 public List<C> getEntityCList() { return entityCList; } 19 } 20 static class C /*implements Comparable<C>*/ { 21 private List<D> entityDList; 22 C(D... datas) { entityDList = Arrays.asList(datas); } 23 public void setEntityDList(List<D> entityDList) { this.entityDList = entityDList; } 24 public List<D> getEntityDList() { return entityDList; } 25 //@Override 26 //public int compareTo(C o) { return 0; } 27 } 28 static class D { 29 private int code; 30 D(int code) { this.code = code; } 31 public Integer getMemberCode() { return code; } 32 } 33 34 public static void main(String[] args) { 35 List<A> entityAList = Arrays.asList( 36 new A(2, 37 new B( 38 new C( 39 new D(1), new D(2), new D(3) 40 ), 41 new C( 42 new D(0) 43 ) 44 ), 45 new B( 46 new C( 47 new D(1), new D(2), new D(1), new D(2) 48 ) 49 ) 50 ) 51 ); 52 53 print(entityAList); 54 55 //List<A> CheckedAList = new ArrayList<>(); 56 for (A entityA : entityAList) { 57 List<B> entityBList = entityA.getEntityBList(); 58 for(B entityB : entityBList) { 59 List<C> entityCList = entityB.getEntityCList(); 60 for(C entityC : entityCList){ 61 List<D> entityDList = entityC.getEntityDList(); 62 63 /* entityDListをMemberCodeの値で絞り込む 64 entityAと同じMemberCodeを持つデータのみを 65 filterdEntityDListに入れる */ 66 List<D> filteredEntityDList = entityDList.stream() 67 .filter(item -> item.getMemberCode().equals(entityA.getMemberCode())) 68 .collect(Collectors.toList()); 69 70 entityC.setEntityDList(filteredEntityDList); 71 } 72 //entityB.setEntityCList(entityCList); 73 } 74 //entityA.setEntityBList(entityBList); 75 //CheckedAList.add(entityA); 76 } 77 78 print(entityAList); 79 } 80 private static void print(List<A> entityAList) { 81 System.out.println("--------"); 82 for(A a : entityAList) { 83 for(B b : a.getEntityBList()) { 84 for(C c : b.getEntityCList()) { 85 for(D d : c.getEntityDList()) { 86 System.out.print(" "+d.getMemberCode()); 87 } 88 System.out.println(); 89 } 90 } 91 } 92 } 93}

実行結果

plain

1-------- 2 1 2 3 3 0 4 1 2 1 2 5-------- 6 2 7 8 2 2

A のコードが 2 なので 2 だけが残っています。

投稿2022/09/06 13:37

編集2022/09/06 13:38
jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問