• 締切済み

ArrayListからHashMapの変換

質問1) ArrayListからHashMapの変換(処理要件は満たすが、より良い方法がないか) 質問2) より良い設計はどうするべきか ※ 長文です。すいません。 == 前提条件:  工程) 保守フェーズ  環境) 3階層のWebシステム(クライアント/AP/DB)、AP実行環境はJava(1.4)、DBはOracle(10g) 処理の目的:  DBに存在するレコードの一覧を画面に表示する。  ただし存在しないレコードはnull(空)表示する。 以下テーブルが存在します。 ----------テーブルイメージ---------------- 内部キー(ID)  表示順序   画面表示名 (以降のカラム省略) ---------------------------------------- 1         1        AAAAAA 2         3        CCCCCC 3         5        DDDDDDD ---------------------------------------- 画面表示は以下です。表示枠は5つ。その他の項目も存在する。 ------------画面表示イメージ-------------- 1: AAAAAA 2: (空) 3: CCCCCC 4: (空) 5: DDDDDDD ----------------------------------------- 現状: DB参照は内製のORマッパを使用します。その内のひとつ、メソッドAは 上記テーブルを対象に3つのDTO(Data Transfer Object)を保持したArrayListを返却します。(orderは内部キー) 一方、画面表示ではkey=Valueでの取扱いが有利なため、HashMapで組んでいます。 このため、新たに構築したHashMapにArrayListの内容を順次展開しながら、Mapに 詰めなおすロジックが必要となっています。 (擬似コード)------ List list = ORマッパ.メソッドA(); Map map = new HashMap(); int order = 0; int listIndex = 0; DTO dto = null; for (int i = 0; i < DISPLAY_MAX_COUNT; i++) {   dto = (DTO)list.get(listIndex);   order = dto.get表示順序();   if (i == order) {     map.put((String)i, dto);      listIndex++;    } else {     map.put((String)i, null);   } } (擬似コード)------ 以上を踏まえ、質問いたします。 質問1) ロジックに対するInput/Outputを変更しない前提で、 ArrayListからHashMapの変換でよりよい方法はないか。 質問2) 仮に設計や製造を一からやりなおすことができるとしたら、 より良い設計はどうするべきか。 長文申し訳ないです。最後まで目を通していただきありがとうございます。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

1)Java詳しくないけど、このままでも良いのでは。 コードが読み切れないほどでもないですし。パフォーマンス的な問題を抱えてるか判断つかないので。 あえて書くと、自分ならこうかな→ http://www.ideone.com/vBbUi 2)もこれだけでは判断つかないような。

関連するQ&A

  • ArrayList内HashMapの取得

    基本的で申し訳ないのですが一番下の行で リストの3つめの要素内のkey=key2でyeahをコンソールに出力したいです。 どのように取得すればいいのでしょうか? list.get(2).get("key2")っぽいかんじで... ArrayList list = new ArrayList(); for (int i = 0; i < 5; i++) { HashMap map = new HashMap(); map.put("key1", "hello"); map.put("key2", "yeah"); map.put("key3", "boo"); list.add(map); } System.out.println(list.get(2));

    • ベストアンサー
    • Java
  • ArrayListとHashMapを利用する問題について

    『問題』 (1)ArrayListのオブジェクトを生成する。 (2)「何回入力しますか?」と出力し、入力処理を行う。 (3)(2)で入力された回数分、以下の処理を行う。   1)HashMapのオブジェクトを生成する。   2)「名前を入力して下さい。」と出力し、入力処理を行う。 3)「性別を入力して下さい。」と出力し、入力処理を行う。   4)「性別を入力して下さい。」と出力し、入力処理を行う。 5) 1)で作成したHashMapに、それぞれ入力された 名前・年齢・性別を設定する。   6)値を設定したHashMapを(1)で作成したArrayListへ格納する。 (4)ArrayListの件数分、以下の処理を行う。   1)ArrayListより、HashMapを取得する。   2)取得したHashMapより、それぞれ設定されている 名前・年齢・性別を取得する。   3)HashMapより取得した名前・年齢・性別を出力する。 『実行結果』 何回入力しますか? 2 名前を入力して下さい。 iwata 年齢を入力して下さい。 27 性別を入力して下さい。 men 名前を入力して下さい。 hana 年齢を入力して下さい。 21 性別を入力して下さい。 women 名前=iwata 年齢=27 性別=men 名前=hana 年齢=21 性別=women 上記のようなプログラムを書く問題について質問します。 (3)までは自力で書けて実行結果もこの通りになったのですが、 (4)が分からずに、実行結果では値の部分がnullと出力されて しまいました。自分でもこの記述は間違っているというのは感じる のですが、どうしたら値がちゃんと格納されるのか分かりません。 「ArrayListより、HashMapを取得する。」←特にこの部分を どう記述してよいのか・・・ 分かる方、上記の部分の記述方法だけでも構わないので教えて下さい。 『自分で書いたプログラム』 import java.util.*; import java.io.*; public class Sample02{ public static void main(String[] args)throws IOException{ ArrayList list = new ArrayList(); System.out.println("何回で入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); for(int i=0; i<num; i++){ HashMap map = new HashMap(); System.out.println("名前を入力して下さい。"); String name = br.readLine(); System.out.println("年齢を入力して下さい。"); String age = br.readLine(); System.out.println("性別を入力して下さい。"); String sex= br.readLine(); map.put("名前", name); map.put("年齢",age); map.put("性別",sex); list.add(name); list.add(age); list.add(sex); } for(int i=0; i<num; i++){ HashMap map = new HashMap(); String name = (String)map.get("名前"); String age = (String)map.get("年齢"); String sex = (String)map.get("性別"); System.out.println("名前=" + name); System.out.println("年齢=" + age); System.out.println("性別=" + sex); } } }

    • ベストアンサー
    • Java
  • HashMapがおかしい

    HashMap で以下の様にコーディングしました。 当然 map の中には19個のオブジェクトが存在するはずですが、何故か15個しかありません。どなたか原因を御存知でしょうか? HashMap map = new HashMap(); map.put("key1", new Integer(1)); . (2->8)省略 . map.put("key9", new Integer(9)); map.put("key10", new String("10")); . (11->18)省略 . map.put("key19", new String("19")); 以下エクリプスのデバッガで取得したもの。 ECLIPSE 2.1.3 / JDK 1.4.2.03 map= HashMap (id=21) entrySet= HashMap$EntrySet (id=50) keySet= null loadFactor= 0.75 modCount= 19 size= 19 table= HashMap$Entry[32] (id=26) [0]= null [1]= HashMap$Entry (id=28) [2]= HashMap$Entry (id=31) [3]= null [4]= null [5]= null [6]= null [7]= null [8]= null [9]= HashMap$Entry (id=32) [10]= HashMap$Entry (id=33) [11]= null [12]= null [13]= HashMap$Entry (id=34) [14]= HashMap$Entry (id=35) [15]= HashMap$Entry (id=36) [16]= HashMap$Entry (id=37) [17]= null [18]= null [19]= null [20]= HashMap$Entry (id=38) [21]= null [22]= null [23]= HashMap$Entry (id=39) [24]= HashMap$Entry (id=40) [25]= null [26]= HashMap$Entry (id=41) [27]= HashMap$Entry (id=42) [28]= null [29]= HashMap$Entry (id=43) [30]= HashMap$Entry (id=44) [31]= null threshold= 24 values= null

    • ベストアンサー
    • Java
  • HashMapについて

    質問させてください 以下に簡単なコードをJBuilderで作成しました。 printでブレークをはってmapインスタンスを評価してみると、mapに20個のキーが登録されるはずが、 16個しかいません。 この時点でstr1[16]が評価しても表示されていないのですが、map.get()で正常に取得はできています。 どのようなことが考えられるか、わかる型がいましたら教えてください。よろしくお願いいたします。 import java.util.*; class Test { public static void main(String[]args){ HashMap map = new HashMap(); String str1[] = new String[20]; String str2[] = new String[20]; for(int i = 0; i < 20; i ++){ str1[i] = new String(Integer.toString(i)); str2[i] = new String(Integer.toString(i * 10)); map.put(str1[i],str2[i]); } System.out.println("デバック用ブレーク"); System.out.println(map.get(str1[11])); } }

    • ベストアンサー
    • Java
  • arraylist 二次元配列

    こんにちは 今アレイリストの二次元配列を学習しています DBからデータを取得で表示したいと思っています そこでfor文の拡張とつかうとうまくいうのですが 普通に記述するとうまくいきません 拡張FOR 文を使うのは初めてなので 何が違うかアドバイスお願いします コンパイルできません↓ if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){ ArrayList<ArrayList> hai = new ArrayList<ArrayList>(); ArrayList list = (ArrayList)request.getAttribute("list"); if (list != null) { hai.add(list); } ArrayList list1 = (ArrayList)request.getAttribute("list1"); if (list1 != null) { hai.add(list1); } ArrayList list2 = (ArrayList)request.getAttribute("list2"); if (list2 != null) { hai.add(list2); } for (int i = 0; i < hai.get(0).size(); i++) { %> <table border="3"> <tr> <% for (int k = 0 ; k <= hai.size(); k++) { %> <td width="60"> <% out.print(hai.get(i)); } %> コンパイルOK 表示できています <% if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){ ArrayList<ArrayList> hai = new ArrayList<ArrayList>(); ArrayList list = (ArrayList)request.getAttribute("list"); if (list != null) { hai.add(list); } ArrayList list1 = (ArrayList)request.getAttribute("list1"); if (list1 != null) { hai.add(list1); } ArrayList list2 = (ArrayList)request.getAttribute("list2"); if (list2 != null) { hai.add(list2); } for (int i = 0; i < hai.get(0).size(); i++) { %> <table border="3"> <tr> <% for (ArrayList list4 : hai) { %> <td width="60"> <% out.print(list4.get(i)); } %> <br> </tr> </table> <% 上のソースの エラーメッセージ 2013/04/16 9:24:12 org.apache.catalina.core.ApplicationDispatcher invoke 致命的: サーブレット jsp のServlet.service()が例外を投げました java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 よろしくお願いします

    • ベストアンサー
    • Java
  • HashMapについて

    java初心者です。 HashMap oya= new HashMap(); HashMap child=null; child = new HashMap(); child.put("test1",Object1); child.put("test2",Object2); oya.put("Oya1",child); child = new HashMap(); child.put("test3",Object3); child.put("test4",Object4); child = new HashMap(); oya.put("Oya2",child); 上記のように値をセットした状態で ループの中でtest1の値を比較したいのです。 たとえば下記みたいに下記のやり方では出来なのは分かっています 値の比較の仕方を教えてください。 for(int i=0;oya.size();i++){ if(test1.equals("aaaa")){ bbb = "kkk"; break; } } よろしくお願いします。

    • ベストアンサー
    • Java
  • HashMap.putについて

    ご質問させて頂きます。 hashMap.putの使い方が良く分かりません。 例えば、以下のようなkudamono.csvファイルがあるとします。 ------------------- A,2003/01/01,スイカ B,2003/02/01,バナナ C,2003/03/01,メロン D,2003/04/01,イチゴ ------------------- このデータをhashMap.putでセットしたいので 以下のようなクラスにしたんですが コンパイルエラーが出てしまいます。 ------------------- /*HashMap生成(クラス変数)*/ public static HashMap hashMap = new HashMap(); public static void main(String args[]) throws Exception { FileReader filereader = new FileReader("kudamono.csv"); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 1; int j = 0; while((line = bufferedreader.readLine()) != null) { System.out.println("Start line at " + i); StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { HashMap.put(stringTokenizerTest.nextToken().toString()); j++; } i++; } filereader.close(); } } --------------- たぶんHashMap.putをする前に キーをセットしたり変数を宣言したりすると思うのですが その辺が良く分かりません。 ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • HashMapについて

    【Java-Class】 JavaでDBの終了まで、日付・DB有無フラグを退避する。 【JSP】 DB有無フラグが存在する場合は"・"をカレンダーに表示する。 という処理を行いたいと思います。 HashMapを使用して put(),get()を使用したいと思いますが、get()を実行した際にNullPointerExceptionが表示されてしまいます。 エラーを見る限りではputの際に配列に設定していないのが原因なのではないかと思いますが、 修正方法がよくわかりません。 どうかよろしくお願いします。 ===DBSelect.java================================= CalenderHash hash = new CalenderHash(); /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString(YMD), "1"); } ===CalenderHash.java============================= public class CalenderHash { protected HashMap ht; public CalenderHash(){ } public void HashPut(Object YMD,Object Flg){ ht.put(YMD,Flg); } public Object get( Object key ) { return(ht.get(key)); } ==JSPの一部 ============================ for ( int i=1; i<=6; i++){ out.println("<TR ALIGN='right'>"); out.println("<TD>"); <省略> YearMD = year + month + Day; mark = ""; // 値の取得 if ( hash.get(YearMD).equals("1")){ mark = "・"; } %> <A HREF="/Schedule/jsp/memo.jsp?Ymd=<%= YearMD %> "><%= mark %><%= cntday %></A> &nbsp; <% } out.println("</TD>"); } out.println("</TR>"); }

    • ベストアンサー
    • Java
  • ArrayListなかへのArrayListオブジェクトのセット方法

    スケジュールのプログラムを作成していまして、1日分のオブジェクトをArrayListにいれて、さらに、1日分のArrayLisのオブジェクトを1ヶ月のArrayListにいれました。 そこで、1ヶ月のArrayListのオブジェクトから1日のArrayListのオブジェクトに分解して、表示したところに、最後の日にちの件数が表示されました。 1.ArrayListにオブジェクトをいれますと、うまく表示されます。 2.ArrayListにArrayListオブジェクトをいれまして、総件数を表示したら、1日から31日までのArrayListのsizeメソッドが最後の日にちが表示されます。よって1日から30日のArrayListに31日分のArrayListが上書きされているように思われます。 1と2の違いと原因をご教授下さい。 //arraylist作成1ヶ月分。 public ArrayList setMonth(int year,int month,int user_id){ -省略- ArrayList monthList=null; for(int count=1; count<=day; count++){ monthList=new ArrayList(); ArrayList dayList=new ArrayList(); dayList=setDay(year,month,count); monthList.add(dayList); } for(int a=0; a<monthList.size(); a++){ ArrayList saa = (ArrayList)monthList.get(a); int mm= saa.size(); System.out.println("mm:"+mm); } return monthList; -省略- } //ArrayList作成1日分 public ArrayList setDay(int year,int month,int day){ ArrayList aList = new ArrayList(); -省略- while(rs.next()){ Allday schAll=new Allday(); schAll.setSchedule_id(rs.getInt("schedule_id")); schAll.setContents(rs.getString("contents")); aList.add(schAll); } for(int b=0; b<aList.size(); b++){ int si= ((Allday)aList.get(b)).getSchedule_id(); String con=((Allday)aList.get(b)).getContents(); } return aList; -省略- }

    • ベストアンサー
    • Java
  • HashMapで要素を指定から削除

    JavaでHashMapについて質問です。 public map remove(key); これだとキーを指定して、要素を削除しますが、 キーを指定せず、要素のみ(例えば要素がnullの場合全て)を指定してキー、要素の削除する方法はありますか? キーの設置数が多く、要素がnullの多くて要素nullを一括して表示させたく無いので質問しました。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう