🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

ArrayList

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

13797閲覧

一度Listに格納したBeanクラス型のインスタンスを取り出し、フィールドの値を変更する方法

Dash_003

総合スコア27

Java

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

ArrayList

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/12/12 02:07

【実現したいこと】
1、同一のBeanクラス型のインスタンスをwhile文内で生成し、Listに複数格納する。
2、特定のインスタンスだけを取り出し、フィールドの値を変更したうえで再び格納する。

【疑問点】
1、while文内で生成したインスタンスの値を後から変更する事はそもそもできるのか

想定しているコードと流れ

//リストを宣言 List<Food> foods = new arrayList<Food>(); while(条件){ Food food = new Food(); food.setName(); food.setPriceNum(); food.setOrderNum(); foods.add(food); } //この後、一度格納したBeanを取り出しPriceNumとOrderNumを変更したい

【このような疑問が出た経緯】
・お店で注文を管理するロジックを考えていた。商品名が異なる料理が注文された場合は新しくインスタンスを生成してリストに追加するが、すでに同一の商品名のインスタンスが格納されている場合はPriceNumとOrderNumという売り上げ合計、注文数合計のフィールドだけを変更したい、という意見がでた。
リストを使うかマップを使うかという問題もあるが、いちばんは一度格納したBeanのフィールドにアクセスし、変更が可能かを知りたいです。

よろしくお願いします。

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

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

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

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

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

dodox86

2019/12/12 02:15

ご自分で実際に試してみればすぐに分かることだと思うのですが。。。そうではない事情があるのでしょうか。
Dash_003

2019/12/12 02:17

自分の中に考えはあるのですが、それが合っているのか、間違っているのかを知りたいという目的もあります。 ちなみにdodox86さんはどうお考えですか?
dodox86

2019/12/12 02:23

whileループ内でいちいちインスタンスを生成し、それらを何らかのコンテナに格納しているのですから、あとで対象のインスタンスを操作すれば、そのインスタンスのみに影響が及ぼされるし、影響は残ったままです。
Dash_003

2019/12/12 02:31

それをするのに、具体的にどのような手法を取るのか、という質問です。 対象のインスタンスを操作→どのように?
guest

回答2

0

ベストアンサー

リストを使うかマップを使うかという問題もあるが、いちばんは一度格納したBeanのフィールドにアクセスし、変更が可能かを知りたいです。

ArrayListMapHashMapなどのコンテナクラスでは、要素を取り出したいときに使うメソッドはそれぞれ違います。ArrayListに限って言えば
ArrayList#getArrayList#indexOfなどで取り出すことになるでしょう。いずれにせよ(格納の仕方にもよるでしょうが)コンテナに入れるものがクラスのインスタンスならば、その参照がコンテナに入ってることになるので、それを取り出して変更などの操作をすれば、リスト中の要素(インスタンス)にも影響を及ぼします。つまり「変更は可能」です。以下は簡単なサンプルコードです。ご提示のコードがArrayListで扱っているのでサンプルでもそれを使っていますが、それが本当に適切かどうかは質問者さんご自身でご検討ください。

Java

1/* t1.java */ 2import java.util.ArrayList; 3 4class Food { 5 private String name = null; 6 private int priceNum = 0; 7 private int orderNum = 0; 8 9 public void setName(String name) { this.name = name; } 10 public String getName() { return name; } 11 12 public void setPriceNum(int num) { this.priceNum = num; } 13 public int getPriceNum() { return this.priceNum; } 14 15 public void setOrderNum(int num) { this.orderNum = num; } 16 public int getOrderNum() { return this.orderNum; } 17} 18 19public class t1 { 20 public static void main(String args[]) { 21 System.out.println("t1.main"); 22 23 Food food3 = null; 24 25 ArrayList<Food> list = new ArrayList<Food>(); 26 for (int i = 1; i <= 4; i++) { 27 Food food = new Food(); 28 food.setName(String.format("name%02d", i)); 29 food.setPriceNum(i * 10); 30 food.setOrderNum(i * 100); 31 list.add(food); 32 33 // 3つ目を別に保存しておいてみる 34 if (i == 3) { 35 food3 = food; 36 } 37 } 38 39 // 現在のリストの内容 40 dump(list); 41 42 int index = list.indexOf(food3); 43 // 44 // インデックスは2のはず list[2] 45 assert index == 2; 46 47 Food foodRef = list.get(index); 48 49 // 同じインスタンスのはず 50 assert foodRef == list.get(index); 51 52 // foodRef(=list[2])に新しい値をセットする。 53 food3.setName("NewNameFor#3"); 54 food3.setPriceNum(333); 55 food3.setOrderNum(3333); 56 57 // 修正後のリストの内容を表示 58 dump(list); 59 } 60 61 private static void dump(ArrayList<Food> list) { 62 System.out.println("--------"); 63 for (Food food: list) { 64 String message = String.format("Food: name=%s, priceNum=%d, orderNum=%d", 65 food.getName(), food.getPriceNum(), food.getOrderNum()); 66 System.out.println(message); 67 } 68 } 69} 70

上記コードの実行結果です。リスト中のlist[2]のインスタンスに影響があるのが分かります。尚、javaコマンド実行時に"-ea"オプションを付け、コード中のassert診断が有効になるようにしています。

CMD

1C>javac t1.java 2 3C>java -version 4java version "1.8.0_162" 5Java(TM) SE Runtime Environment (build 1.8.0_162-b12) 6Java HotSpot(TM) Client VM (build 25.162-b12, mixed mode, sharing) 7 8C>java -ea t1 9start t1.main 10-------- 11Food: name=name01, priceNum=10, orderNum=100 12Food: name=name02, priceNum=20, orderNum=200 13Food: name=name03, priceNum=30, orderNum=300 14Food: name=name04, priceNum=40, orderNum=400 15-------- 16Food: name=name01, priceNum=10, orderNum=100 17Food: name=name02, priceNum=20, orderNum=200 18Food: name=NewNameFor#3, priceNum=333, orderNum=3333 19Food: name=name04, priceNum=40, orderNum=400 20 21C>

追記しました: 2019-12-12 14:46

ArrayListの場合、リスト中のインスタンスを検索する時にループなどでArrayList#getで要素を逐一見ていく必要があるかもしれません。Stream APIを使うとよりスマートなコードとなる場合もあります。

Java

1import java.util.List; 2import java.util.ArrayList; 3import java.util.stream.Collectors; 4 5...省略 6 7// Stream APIを使って指定の要素(例:nameフィールドが"name04")のインスタンスを取得 8List<Food> foods = list.stream().filter(elem -> elem.getName().equals("name04")).collect(Collectors.toList()); 9if (foods.size() == 1) { 10 Food target = foods.get(0); 11 target.setName("NewNameFor#4"); 12 target.setPriceNum(444); 13 target.setOrderNum(4444); 14}

投稿2019/12/12 03:30

編集2019/12/12 05:47
dodox86

総合スコア9256

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

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

0

whileが入ろうが、Listにいったん突っ込もうが、基本的に個々のメソッドは独立しています。

java

1Food f1 = new Food(); 2// List<Food> foods; 3Food f2 = foods.get(0);

このf1,f2いずれも「Food型のオブジェクト」には変わりはなく、List.getが入ったからと言ってf2がなんか変なことになっているかというと特にそんなこともないです。全く同じように

java

1f1.setOrderNum(); 2f2.setOrderNum();

とできます。

投稿2019/12/12 02:44

swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問