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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

4354閲覧

JAVAでLISTの中身が書き換わってしまう

koppe

総合スコア14

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2019/05/31 05:03

編集2019/05/31 05:12

お世話になっております
皆様のお知恵を拝借できたら幸いでございます

JAVA(SpringBoot)にてファイルアップロードのシステムを作成しており動作途中で
Listの中身が書き換わってしまう事象です。

前提・実現したいこと

WEB側より複数のファイルアップロードを行い、既に登録がされているファイルを
除いた新規登録分だけを受け付ける仕組みを想定しています

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

エラーは出ないのですが後述コード内のList変数の中身が後から登録されたデータに書き換わってしまいます

tnpFileNewdata.add(addData);

プログラム実行後のデータ
[fileName=tnpfile_03.pdf, size=700, serial=003]
[fileName=tnpfile_03.pdf, size=700, serial=003]

同じレコードが二つ出来ます

該当のソースコード

Web側から受けるデータは変数tnpListに格納
中身は3ファイル分

ファイル一つ目

kyevalue
alradyFlg1
fileNametnpfile_01.pdf
fileSize800
fileSerialNo001

ファイル二つ目

kyevalue
alradyFlg0
fileNametnpfile_02.pdf
fileSize650
fileSerialNo002

ファイル三つ目

kyevalue
alradyFlg0
fileNametnpfile_03.pdf
fileSize700
fileSerialNo003

二つ目と三つ目が登録される想定です

Bean

1pabulic class tnpFileBean{ 2 /**登録済みフラグ 0=新規登録 1=登録済み.*/ 3 private int alradyFlg; 4 /**ファイル名.*/ 5 private String fileName; 6 /**ファイルサイズ.*/ 7 private String fileSize; 8 /**ファイル管理番号.*/ 9 private String fileSerialNo; 10 11 public int getAlradyFlg(){ 12 return alradyFlg 13 } 14 public String getFileName(){ 15 return fileName 16 } 17 public String getFileSize(){ 18 return fileSize 19 } 20 public String getFileSerialNo(){ 21 return fileSerialNo 22 } 23//setterは略 24}

Service

1 List<Map<String, Object>> tnpFileNewdata = new ArrayList<Map<String, Object>>(); 2 Map<String, Object> addData = new HashMap<String, Object>(); 3 for (tnpFileBean registTnpFile : tnpList) { 4 if (registTnpFile.getAlradyFlg() == 0) { 5 addData.clear(); 6 addData.put("fileName", registTnpFile.getBtrFilePath()); 7 addData.put("size", registTnpFile.getFileSize()); 8 addData.put("serial", registTnpFile.getFileSerialNo()); 9 tnpFileNewdata.add(addData); 10 } 11 }

補足説明

デバッグモードでステップ実行したところ
ループの初回に到達したaddの時点では
tnpFileNewdataの中身は
[fileName=tnpfile_02.pdf, size=650, serial=002]

2回目のループではaddの行に到達する前に
[fileName=tnpfile_03.pdf, size=700, serial=003]
上記に下記変わってました

参照値でもListに渡した後のList内でも変わってしまうものなのでしょうか

期待している値は
[fileName=tnpfile_02.pdf, size=650, serial=002]
[fileName=tnpfile_03.pdf, size=700, serial=003]
になります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

回答:
同一のHashMapインスタンスに対して[clear]を行って格納情報を削除しているため。
全て別の要素にするならば、For文内で利用する都度インスタンス化しなければならない。
後蛇足ですが、JAVAの場合クラス名の1文字目は基本的に大文字にした方がいいです。

解説:
前提として、tnpList には tnpFileBean 型のインスタンスが3つ格納されているとします。

for文の外でHashMapをインスタンス化してます。

java

1Map<String, Object> addData = new HashMap<String, Object>();

すると、HashMapのインスタンスが1つ生成されます。
コードの説明を入れますと、

JAVA

1 Map<String, Object> addData = new HashMap<String, Object>(); 2 for (tnpFileBean registTnpFile : tnpList) { 3 if (registTnpFile.getAlradyFlg() == 0) { 4 // addDataには2週目以降、1つ前にputメソッドで追加した内容が含まれますが、 5         // 2週目の場合、tnpFileNamedataの0番目に格納したaddDataのインスタンスは 6         // 同じインスタンスです。 7 // そのインスタンスの格納情報をclearメソッドにてクリアします。 8         // tnpFileNamedataの0番目に格納したaddDataのインスタンスは同じなので格納情報が消えます。 9 addData.clear(); 10 addData.put("fileName", registTnpFile.getBtrFilePath()); 11 addData.put("size", registTnpFile.getFileSize()); 12 addData.put("serial", registTnpFile.getFileSerialNo()); 13 tnpFileNewdata.add(addData); 14 } 15 }

全部べつにしたければ、全て別のHashMapインスタンスを代入し直さなくてはならないので以下のような状態にしなくてはなりません。

JAVA

1 Map<String, Object> addData = null; 2 for (tnpFileBean registTnpFile : tnpList) { 3 if (registTnpFile.getAlradyFlg() == 0) { 4 addData = new HashMap<String, Object>(); 5 addData.put("fileName", registTnpFile.getBtrFilePath()); 6 addData.put("size", registTnpFile.getFileSize()); 7 addData.put("serial", registTnpFile.getFileSerialNo()); 8 tnpFileNewdata.add(addData); 9 } 10 }

投稿2019/05/31 05:48

kanimaru

総合スコア1013

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

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

koppe

2019/06/04 02:50

ご回答ありがとうございます。 無事動作いたしました。 デバッグ中不思議だったのが変数addDataがeclipseの「変数」ビューに表示されなかったのです ブレークポイントを置いてaddDataの記載箇所にマウスカーソルを近づけても「Map<String, Object> addData ~(以下略)」と表示され、実際に入っているはずの値が確認できませんでした。 今回 Map<String, Object> addData = null; を通過したところで変数ビューにも表示されるようになり、正常に動作いたしました 本当に助かりました。 ありがとうございました。
guest

0

変数の内容が上書きされてしまっています。

Java

1 List<Map<String, Object>> tnpFileNewdata = new ArrayList<Map<String, Object>>(); 2 for (tnpFileBean registTnpFile : tnpList) { 3 if (registTnpFile.getAlradyFlg() == 0) { 4 //addData.clear(); 5 Map<String, Object> addData = new HashMap<String, Object>(); 6 //↑同じ器を使いまわすのではなく、新たに用意しないと上書きされる 7 addData.put("fileName", registTnpFile.getBtrFilePath()); 8 addData.put("size", registTnpFile.getFileSize()); 9 addData.put("serial", registTnpFile.getFileSerialNo()); 10 tnpFileNewdata.add(addData); 11 } 12 }

投稿2019/05/31 05:43

mar-kn

総合スコア306

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

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

koppe

2019/05/31 06:38

ご回答ありがとうございます。 ご教示頂いた内容を試したところ 処理結果は変わらずでした。
mar-kn

2019/06/02 02:32

Service の tnpList の中身には、ファイル1つ目、ファイル2つ目、ファイル3つ目 の中身が入ってますか?
koppe

2019/06/04 02:42

度々のご回答ありがとうございます。 tnpListの中身はファイル3つ分それぞれの中身がはいっております
mar-kn

2019/06/04 02:50

tnpList の中身はデバッガなどで確認されましたか? また解決済みになったということは、kanimaruさんの提示されたコードでは正しく動いたということでしょうか?
koppe

2019/06/04 02:57

ご回答ありがとうございます kanimaru様のコードで正しく動作いたしました。 tnpList の中身はデバッガで確認しましたそれぞれfor文のループごとに変化がないかどうかも監視してましたが、変わることはありませんでした。 ただ懸念点がaddDataの中身が確認ができなかったことです。変数ビューに表示されず、ブレークポイントを置いてマウスカーソルを近づけても変数の中身が確認できませんでした 少々不明な点が残りましたが、無事動きました。ご協力ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問