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

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

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

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

ArrayList

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2342閲覧

二つの配列を一つのfor文で回す事はできますでしょうか。

mikannn

総合スコア5

Java

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

ArrayList

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/04 10:37

編集2021/02/04 11:40

Java

1package controller; 2 3import java.io.IOException; 4import java.util.ArrayList; 5import java.util.HashMap; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13import javax.servlet.http.HttpSession; 14 15import dao.ProductDao; 16import dao.SalesDao; 17import model.CartBean; 18 19/** 20 * Servlet implementation class ConfirmationServlet 21 */ 22@WebServlet("/ConfirmationServlet") 23public class ConfirmationServlet extends HttpServlet { 24 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 // TODO Auto-generated method stub 28 29 //購入確認機能制御用クラス 30 31 HttpSession session = request.getSession(false); 32 @SuppressWarnings("unchecked") 33 ArrayList<CartBean> product_select_list = (ArrayList<CartBean>) session.getAttribute("product_select_list"); 34 35 ProductDao pro_dao = new ProductDao(); 36 37 ArrayList<Integer> product_cd_list = new ArrayList<Integer>(); 38 39 for (CartBean i : product_select_list) { 40 41 product_cd_list.add(i.getPro_cd()); 42 } 43 44 HashMap<Integer, Integer> new_stock_no = pro_dao.get_new_stock_no(product_cd_list); 45 46 System.out.println("map在庫" + new_stock_no.get(product_cd_list.get(0))); 47 48 for (CartBean i : product_select_list) { 49 int newStockNo = (int) (new_stock_no.get(i.getPro_cd())); 50 i.setStock_no(newStockNo); 51 } 52 53 //購入後の在庫更新のためのArrayList 54 ArrayList<Integer> remainingStockNo = new ArrayList<Integer>(); 55 56 //salesテーブルに更新するため。合計金額を入れるArrayList。 57 ArrayList<Integer> salesPrice = new ArrayList<Integer>(); 58 59 //-------------------------------------------------------------------------------------------------------------- 60 for (CartBean i : product_select_list) { 61 62 System.out.println("ConfirmationServlet:各商品の在庫数。 " + i.getPro_name() + ": " + i.getStock_no()); 63 System.out.println("ConfirmationServlet:各商品の購買数。 " + i.getPro_name() + ": " + i.getProduct_buy_no()); 64 65 if (i.getStock_no() < i.getProduct_buy_no()) { 66 67 session.setAttribute("product_select_list", product_select_list); 68 69 System.out.println("ConfirmationServlet:在庫がない状態。エラー文表示"); 70 request.setAttribute("error", "お買い求め商品の残り在庫がありません。"); 71 RequestDispatcher rd = request.getRequestDispatcher("/jsp/Confirmation.jsp"); 72 rd.forward(request, response); 73 //returnはこれ以上、下の処理に進まないようにするための処理。メモ return文 戻り値なしで検索 74 //returnは処理を1ブロックではなく全て終了します。 75 return; 76 77 } else { 78 //----------------------------------------------------------------------------------------------------------------- 79 //⒉残り在庫計算(productテーブル) 80 System.out.println("ConfirmationServlet:在庫数に余裕がある"); 81 82 83 int remaining_stock_no = i.getStock_no() - i.getProduct_buy_no(); 84 System.out 85 .println("ConfirmationServlet:各商品の在庫数-購買数=残りの在庫数。 " + i.getPro_name() + ": " 86 + remaining_stock_no); 87 88 //データベースに一括で更新するために、remainingStockNoに追加していく。 89 remainingStockNo.add(remaining_stock_no); 90 91 //--------------------------------------------------------------------------------------------------------------- 92 //3.Salesテーブル更新 93 94 //④商品ごとの合計金額。 95 //商品ごとの合計金額(購入商品の値段 * 購入個数) 96 int sales_price = i.getPro_price() * i.getProduct_buy_no(); 97 System.out.println("ConfirmationServlet:商品ごとの合計金額:" + sales_price); 98 99 salesPrice.add(sales_price); 100 101 } //if分括弧 102 } //for文括弧 103 //------------------------------------------------------------------------------------------------------------------- 104--- 105 //2.購入後のproductテーブル更新 106 //④購入後の在庫更新(SalesDao.javaのメソッドを呼び、在庫数を更新する。) 107 pro_dao.remaining_stock_no_update(product_cd_list, remainingStockNo); 108--- 109 110 111 112 //3.Salesテーブル更新 113 int user_id = (int) session.getAttribute("user_id"); 114 System.out.println("ConfirmationServlet:ユーザIDの番号: " + user_id); 115 116 //SalesDao.javaのメソッドを使いためのインスタン生成。 117 SalesDao sal_db = new SalesDao(); 118 119 //⑤Sales(購入テーブル)に格納する。 120 //ユーザーID(user_id),商品コード( pro_cd),購入金額(product_sum_price)を入れる 121--- 122 sal_db.sales_db_insert(user_id, product_cd_list, salesPrice); 123--- 124 //------------------------------------------------------------------------------------------------------------------- 125 //product_select_listを消す←購入を続けるとき、履歴を消すため。 126 product_select_list = new ArrayList<CartBean>(); 127 session.setAttribute("product_select_list", product_select_list); 128 129 //Complete.jsp(購入画面)に行く。 130 RequestDispatcher rd = request.getRequestDispatcher("/jsp/Complete.jsp"); 131 rd.forward(request, response); 132 } 133} 134

Java

1//ConfirmationServletより、商品を判別するための商品コードと、残り在庫数を取ってくる。 2 public void remaining_stock_no_update(ArrayList<Integer> product_cd_list, ArrayList<Integer> remainingStockNo) { 3 4 String url = "jdbc:mysql://localhost/ecsite?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&" 5 + "useJDBCCompliantTimezoneShift=true&" 6 + "useLegacyDatetimeCode=false&" 7 + "serverTimezone=UTC"; 8 String id = "root"; 9 String pass = "password"; 10 11 Connection con = null; 12 PreparedStatement pstmt = null; 13 14 try { 15 Class.forName("com.mysql.jdbc.Driver"); 16 con = DriverManager.getConnection(url, id, pass); 17 18--- 19 //SQL文-------------------------------------------------------------------------------------------- 20       for() { 21 pstmt = con.prepareStatement("update product set stock_no = ? where pro_cd = ?"); 22 //残り在庫 23 pstmt.setInt(1, remainingStockNo.get()); 24 //商品コード 25 pstmt.setInt(2, pro_cd_list.get()); 26 27 pstmt.executeUpdate(); 28 } 29--- 30 } catch (ClassNotFoundException ex) { 31 //例外の文をコンソールに出力。何行目にエラーが出てるかの説明。 32 ex.printStackTrace(); 33 } catch (SQLException ex) { 34 ex.printStackTrace(); 35 } finally { 36 try { 37 if (pstmt != null) { 38 //後片付け 39 pstmt.close(); 40 } 41 if (con != null) { 42 //後片付け 43 con.close(); 44 } 45 } catch (Exception ex) { 46 } 47 } 48 }

 PoductDaoに引数としてArrayListを二つ持ってきたのですがそれをSQL文プリペアドステートメントに活用したいです。
しかし、二つのArrayListの中身を活用するにはネストしか思いつかず、ArrayListの二次元配列を使い、二つの配列をネストせずに回したいです。
二つの配列をネストせずに二つの配列を回す方法はありますでしょうか?

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

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

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

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

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

m.ts10806

2021/02/04 10:45

コードの中に実際のコードにないのものは入れないようにしてください。 forの中にupdate文入れてしまうとまずいんでは。 executeUpdateはSQLを1つだけ実行するもののはずです。 あと、「どういう配列にするか」イメージはできてますか?
mikannn

2021/02/04 11:29

返信頂き誠にありがとうございます。 コードの中にいらないものをいれてしまいすみませんでした。ご指摘頂きありがとうございます。 「forの中にupdate文入れてしまうとまずいんでは。」という質問に対しては、確かに、ArrayListのサイズ分だけ更新処理したいので、間違っていました。ありがとうございます。 質問の意図にあっていなければ申し訳ありません。 「「どういう配列にするか」イメージはできてますか?」に関しては、よくわかっていません。
m.ts10806

2021/02/04 11:35

** とか、入ってますか? 質問のコードを削るのではなく、お手元のコードをコピペしてください。
mikannn

2021/02/04 11:37

なるほど申し訳ありませんでした。修正させて頂きます。
Zuishin

2021/02/04 11:41

この場合のネストが何を意味するのかわからないけど、ネストしたらまずいんですか?
mikannn

2021/02/04 11:56 編集

返信頂きありがとうございます。 SQL文のfor文の所をネストにして考えた場合です。ややこしくて申し訳ありません。 ネストにしてやってみたのですが、外側のfor文が回っている間に、内側のfor文が回ってしまうので、入れたい値が入らないため、ネストでかけないです。 for(int i = 0; i <= product_cd_list.size(); i++ ){ for(int j = 0; j <= remainingStockNo.size();j++){ pstmt = con.prepareStatement("update product set stock_no = ? where pro_cd = ?"); //残り在庫 pstmt.setInt(1, remainingStockNo.get(j)); //商品コード pstmt.setInt(2, pro_cd_list.get(i)); pstmt.executeUpdate(); } } ネストの場合、上記のように考えてます。
Zuishin

2021/02/04 12:05

product_cd_list が商品リストで、remainingStockNo が在庫数ですよね? だとしたら remainingStockNo を回しちゃいけません。 product_cd_list[i] から在庫数を計算できるようにする必要があります。 在庫数だけからリストを作っているのが間違いです。 商品をキーに、在庫数を値にしたハッシュマップを作り、商品から在庫数を得られるようにしてみてください。
mikannn

2021/02/04 12:17

HashMapで考え直して作らせて頂きます。 助言誠にありがとうございます。
guest

回答2

0

ベストアンサー

ArrayListを2つ持つのではなくMapのArrayListを持てば、keyとvalueのリストになるので1つにまとめられると思いますが、いかがでしょうか。

投稿2021/02/04 15:10

favoriteigo

総合スコア66

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

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

mikannn

2021/02/05 09:04

返信頂き誠にありがとうございます。 SQL文を更新するためには各商品コードリストと、各在庫数リストが必要なのですが、そのためにリストを二つ必要としています。 HashMapにコードをKey、valueを在庫数にした場合、在庫数は取ってこれると思うのですが、keyの値となっている商品コードをvalueとしてどう取り出すのかが自分にはわかっていません。 ですので、今回は二つリストを呼びだした形を取らさせて頂いております。助言の意図にあっていない場合は申し訳ありません。 最後に、助言誠にありがとうございます。
guest

0

Java

1package controller; 2 3import java.io.IOException; 4import java.util.ArrayList; 5import java.util.HashMap; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13import javax.servlet.http.HttpSession; 14 15import dao.ProductDao; 16import dao.SalesDao; 17import model.CartBean; 18 19/** 20 * Servlet implementation class ConfirmationServlet 21 */ 22@WebServlet("/ConfirmationServlet") 23public class ConfirmationServlet extends HttpServlet { 24 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 // TODO Auto-generated method stub 28 29 //購入確認機能制御用クラス 30 31 HttpSession session = request.getSession(false); 32 @SuppressWarnings("unchecked") 33 ArrayList<CartBean> product_select_list = (ArrayList<CartBean>) session.getAttribute("product_select_list"); 34 35 ProductDao pro_dao = new ProductDao(); 36 37 ArrayList<Integer> product_cd_list = new ArrayList<Integer>(); 38 39 for (CartBean i : product_select_list) { 40 41 product_cd_list.add(i.getPro_cd()); 42 } 43 44 45 HashMap<Integer, Integer> new_stock_no = pro_dao.get_new_stock_no(product_cd_list); 46 47 System.out.println("map在庫" + new_stock_no.get(product_cd_list.get(0))); 48 49 //在庫刷新(HashMapに格納した在庫を新しく入れ替えていく。) 50 for (CartBean i : product_select_list) { 51 int newStockNo = (int) (new_stock_no.get(i.getPro_cd())); 52 i.setStock_no(newStockNo); 53 } 54 55 //購入後の在庫更新のためのArrayList 56 HashMap<Integer, Integer> remainingStockNo = new HashMap<Integer, Integer>(); 57 58 //salesテーブルに更新するため。合計金額を入れるArrayList。 59 ArrayList<Integer> salesPrice = new ArrayList<Integer>(); 60 61 //-------------------------------------------------------------------------------------------------------------- 62 int j = 0; 63 for (CartBean i : product_select_list) { 64 65 66 System.out.println("ConfirmationServlet:各商品の在庫数。 " + i.getPro_name() + ": " + i.getStock_no()); 67 //②product_buy_listから各商品の購買数を取り出す。(CartServlet.javaの商品価格の取り方参考) 68 System.out.println("ConfirmationServlet:各商品の購買数。 " + i.getPro_name() + ": " + i.getProduct_buy_no()); 69 70 if (i.getStock_no() < i.getProduct_buy_no()) { 71 72 session.setAttribute("product_select_list", product_select_list); 73 System.out.println("ConfirmationServlet:在庫がない状態。エラー文表示"); 74 request.setAttribute("error", "お買い求め商品の残り在庫がありません。"); 75 RequestDispatcher rd = request.getRequestDispatcher("/jsp/Confirmation.jsp"); 76 rd.forward(request, response); 77 return; 78 79 } else { 80 //----------------------------------------------------------------------------------------------------------------- 81 //⒉残り在庫計算(productテーブル) 82 System.out.println("ConfirmationServlet:在庫数に余裕がある"); 83 84 Integer remaining_stock_no = i.getStock_no() - i.getProduct_buy_no(); 85 System.out 86 .println("ConfirmationServlet:各商品の在庫数-購買数=残りの在庫数。 " + i.getPro_name() + ": " 87 + remaining_stock_no); 88 89 Integer productSelectListIndex = (Integer)(j); 90 System.out.println("productSelectListIndexの中身" + productSelectListIndex); 91 92 //データベースに一括で更新するために、remainingStockNoに追加していく。 93 remainingStockNo.put(productSelectListIndex, remaining_stock_no); 94 95 //--------------------------------------------------------------------------------------------------------------- 96 //3.Salesテーブル更新 97 int sales_price = i.getPro_price() * i.getProduct_buy_no(); 98 System.out.println("ConfirmationServlet:商品ごとの合計金額:" + sales_price); 99 100 salesPrice.add(sales_price); 101 102 } //if分括弧 103 104 j++; 105 System.out.println(j); 106 107 } //for文括弧 108 //------------------------------------------------------------------------------------------------------------------- 109 //2.購入後のproductテーブル更新 110 pro_dao.remaining_stock_no_update(product_cd_list, remainingStockNo); 111 112 //3.Salesテーブル更新 113 int user_id = (int) session.getAttribute("user_id"); 114 System.out.println("ConfirmationServlet:ユーザIDの番号: " + user_id); 115 116 SalesDao sal_db = new SalesDao(); 117 118 //⑤Sales(購入テーブル)に格納する。 119 //ユーザーID(user_id),商品コード( pro_cd),購入金額(product_sum_price)を入れる 120 sal_db.sales_db_insert(user_id, product_cd_list, salesPrice); 121 //------------------------------------------------------------------------------------------------------------------- 122 123 //product_select_listを消す←購入を続けるとき、履歴を消すため。 124 product_select_list = new ArrayList<CartBean>(); 125 session.setAttribute("product_select_list", product_select_list); 126 127 //Complete.jsp(購入画面)に行く。 128 RequestDispatcher rd = request.getRequestDispatcher("/jsp/Complete.jsp"); 129 rd.forward(request, response); 130 } 131}

Java

1//ConfirmationServletより、商品を判別するための商品コードと、残り在庫数を取ってくる。 2 public void remaining_stock_no_update(ArrayList<Integer> product_cd_list, HashMap<Integer, Integer> remainingStockNo) { 3 4 String url = "jdbc:mysql://localhost/ecsite?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&" 5 + "useJDBCCompliantTimezoneShift=true&" 6 + "useLegacyDatetimeCode=false&" 7 + "serverTimezone=UTC"; 8 String id = "root"; 9 String pass = "password"; 10 11 Connection con = null; 12 PreparedStatement pstmt = null; 13 14 try { 15 Class.forName("com.mysql.jdbc.Driver"); 16 con = DriverManager.getConnection(url, id, pass); 17 18 //SQL文-------------------------------------------------------------------------------------------- 19 for (int i = 0; i < product_cd_list.size(); i++) { 20 pstmt = con.prepareStatement("update product set stock_no = ? where pro_cd = ?"); 21 //残り在庫 22 pstmt.setInt(1, remainingStockNo.get(i)); 23 //商品コード 24 pstmt.setInt(2, product_cd_list.get(i)); 25 26 pstmt.executeUpdate(); 27 } 28 29 //----------------------------------------------------------------------------------------------- 30 31 } catch (ClassNotFoundException ex) { 32 //例外の文をコンソールに出力。何行目にエラーが出てるかの説明。 33 ex.printStackTrace(); 34 //データベースに関する不具合。 35 } catch (SQLException ex) { 36 ex.printStackTrace(); 37 } finally { 38 //tryで囲む理由:ここでもエラーが起こる可能性があるため。 39 try { 40 //リザルトセットがヌルでなかった場合閉じる。 41 if (pstmt != null) { 42 //後片付け 43 pstmt.close(); 44 } 45 if (con != null) { 46 //後片付け 47 con.close(); 48 } 49 } catch (Exception ex) { 50 } 51 } 52 }

HashMapで送信し、在庫数を商品コードキーでとれるようにしました。
一つ目のコードでInteger productSelectListIndex = (Integer)(j);となっている点がおかしいですが、そこを除けばうまくいきました。

投稿2021/02/05 09:15

mikannn

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問