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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Q&A

解決済

3回答

2400閲覧

JavaのMapから値を取り出す

LokiTick

総合スコア27

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

0グッド

0クリップ

投稿2017/08/22 06:07

###前提・実現したいこと
拡張for文を利用して値を取り出したい。
DBから受け取った項目をHashMapに格納し、そのHashMapをArrayListに格納しています。
また、処理は通常のJavaクラス、出力はJSP、仲人はservletとなっております。
JSPにはservletから後述のListにアクセスできるBookクラスのインスタンスを渡しています

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

条件式 String key : マップ.setKey において、Map<String String>にもかかわらずobujectをStringに変換できませんとでます。

###該当のソースコード

Java

1//bookクラス DBから受け取ったデータを保持と、それに関する操作機能------------------- 2//省略 3private Map<String, String> bookData = new HashMap<>(); 4private List<Map> bookList = new ArrayList<>(); 5//DBから受け取るメソッド 6//接続処理省略 7 while(rs.next()) { 8 bookData.clear(); 9 bookData.put("title",rs.getString(1) ); 10 bookData.put("author", rs.getString(2)); 11 bookData.put("publisher", rs.getString(3)); 12 bookData.put("price", rs.getString(4)); 13 bookList.add(bookData); 14 } 15//JSPから利用するgetter 16 public List<Map> getList() { 17 return bookList; 18 } 19 20//出力JSP------------------------------ 21 <% 22 Book book = (Book)request.getAttribute("book"); 23 List<Map> list = book.getList(); 24%> 25 26 <% 27 for(int i = 0; i < list.size(); i++) { 28 for(String key : list.get(i).keySet()) { %> //←この部分にIDEから前述のエラー表記 29 //処理

###試したこと
Map.entryの使用も試みましたが同様の結果に。
<%=list.get(0).get("publisher")%>のように取得すると値は格納されていることを確認。

###補足情報(言語/FW/ツール等のバージョンなど)
Java8,IDEはnetbeans

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

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

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

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

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

guest

回答3

0

ベストアンサー

型情報が足りていません。
Listの中のMapのジェネリクスが省略されてObjectということになっています。

JSP

1//List<Map> list = book.getList(); 2List<Map<String, String>> list = book.getList();

できればサーブレット側もMapの中身が不明なのでジェネリクスのご利用を推奨します。

JAVA

1private List<Map<String, String>> bookList = new ArrayList<>();

ちょっと全体的に不安なコードに見えます。
取得してきたデータが1件ならば正しく動いているように見えますが、
Mapの初期化するタイミングが危ないです。
バグにつながる可能性が高いです。

JAVA

1while(rs.next()) { 2 //bookData.clear(); 3 Map<String, String> bookData = new HashMap<>();

ここ↑でMapインスタンス生成してlistにaddしないと、
listの中身はすべて同じmapを参照することになります。
この動きが意図的ということでしたらすみません。

投稿2017/08/22 06:56

so87

総合スコア764

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

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

LokiTick

2017/08/22 07:03

ご回答ありがとうございました。 皆さんがおっしゃる通り型情報がお粗末になっておりました。 また、so87さんは起こりうるバグをご指摘いただいたのでベストアンサーに選ばさせていただきました。
guest

0

List<Map> list = book.getList();

だからです。Listの中に格納されているMapの型が決められていないため、map.get(キー名)の値はObject型になります。

せっかく手前で private Map<String, String> bookData = new HashMap<>(); としているのですから、private List<Map> bookList = new ArrayList<>(); も次のように省略せずに書かないと、明示的にStringであることがコンパイラはわかりません。

java

1List<Map<String, String>> bookData = new HashMap<>();

これはJSPでも同様です。

投稿2017/08/22 06:45

A-pZ

総合スコア12011

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

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

LokiTick

2017/08/22 07:04

ご回答ありがとう御座います。 型の定義は意識していたのですがそこにも必要だということは理解していませんでした。 ありがとうございました。
guest

0

こちらJSP側でIDEからエラーが出ているということでいいでしょうか。

ジェネリクスを指定していないので、
Map内の型が分からないと言われています。

すべてのList<Map>List<Map<String, String>>にするとエラーは出ないと思いますが、
いっそのこと

for(String key : list.get(i).keySet()) {

for(Object key : list.get(i).keySet()) {

にしてしまって、key.toString()でもいけると思います。
単純にMapのvalueがほしければ、object型でもlist.get(i).get(key)で取得できるはずです。

投稿2017/08/22 06:44

szk.

総合スコア1400

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

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

LokiTick

2017/08/22 07:06

ご回答ありがとうございました。 違ったアプローチも教えていただき勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問