質問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)
仮に設計や製造を一からやりなおすことができるとしたら、
より良い設計はどうするべきか。

長文申し訳ないです。最後まで目を通していただきありがとうございます。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

1)Java詳しくないけど、このままでも良いのでは。


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

2)もこれだけでは判断つかないような。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QモバイルGoogleマップを営業外回りで活用したいのですが、可能でしょ

モバイルGoogleマップを営業外回りで活用したいのですが、可能でしょうか?
現在ドコモのT-01Aというスマートフォンを利用しており、モバイルGoogleマップを利用しております。
仕事は営業外回りなのですが、今回お客様を沢山引き継がせてもらいまして、エクセルで作ったお客様リストから住所をコピペしては、モバイルGoogleマップで検索して訪問しております。
これをパソコン上で行い、スマートフォンのモバイルGoogleマップで一覧表示させることはできませんでしょうか?
モバイルGoogleマップで住所検索すると、ピン状の目印アイコンが地図上に表示されますが、これを毎回検索するのではなく、パソコンで登録かお気に入り化しておいて、モバイルGoogleマップに常時表示させたいのです。
区や市町村が異なっていても、案外近くにお客様が集まっていらっしゃる事がありますので、一件訪問したあとモバイルGoogleマップを開けば、検索しなくても近くのお客様の所在地にアイコンが立っていて、分かるようにしたいのですが、そのような事は可能でしょうか?
モバイルGoogleマップでお気に入り登録すれば良いのでしょうが、パソコンで行えれば時間を大幅に短縮できるので、そのような方法をご存知であればご教授下さい。
(ちなみにGoogleのアカウントは有ります)
よろしくお願いいたします。

モバイルGoogleマップを営業外回りで活用したいのですが、可能でしょうか?
現在ドコモのT-01Aというスマートフォンを利用しており、モバイルGoogleマップを利用しております。
仕事は営業外回りなのですが、今回お客様を沢山引き継がせてもらいまして、エクセルで作ったお客様リストから住所をコピペしては、モバイルGoogleマップで検索して訪問しております。
これをパソコン上で行い、スマートフォンのモバイルGoogleマップで一覧表示させることはできませんでしょうか?
モバイルGoogleマップで住所検索すると...続きを読む

Aベストアンサー

T-01だとウインドウズモバイルでしたね。
ウィンドウズモバイル版だと、メニューボタンからレイヤー>レイヤーをブラウズ>マイマップ
で、ネットにつながっててアカウント登録されてれば、マイマップ情報をネットから落としてきます。
キャプチャ画面はANDOROIDの画面ですが、同様にwindowmobileにも表示されるでしょう。

windowsmobile版のgooglemapは結構ちょこちょこ更新されてるので、最新をDLしましょう。
日本語サイトのmobilegoogleサイトからだと、更新がおろそかなことが多いので、アメリカ版のmobilegoogleサイトから落とすといいでしょう。

QArrayList内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));

Aベストアンサー

何がしたいのか不明ですが。。。。

System.out.println(((HashMap)list.get(0)).get("key2"));

QGoogleマップについて

古いGoogleマップを使おうとすると、地図画面の上部に
「このセッションで従来のGoogleマップに戻しました。次回も従来のGoogleマップを使用しますか?」
と言う薄茶色のバーが出ますが、ここで「使用する」にチェックを入れればその時は消えるんですが
一度閉じてまた開くとそのたびに毎回同じバーが出ます。
これを出なくする方法がありませんか?
古いGoogleマップのほうが便利で使い続けたいのですが。

Aベストアンサー

一度、新しいGoogleマップにして、

マップ右下の『?』マーク>以前のマップに戻る>アンケート表示(答えなくてOK!)>一度以前のマップに戻る、をクリック

この後に、薄茶のバーにある『今後も使用する』をクリックすると固定されるはずです。
お試しください^^

QJAVA  ArrayListからArrayListへのコピー

java で、ArrayListからArrayListへコピーはできるのでしょうか?
clone()というメソッドがありましたが、よくわからず、コピーできてないようなので伺いました。

ベーシックではできるようですが、JAVAでもできるのでしょうか?
どなたか教えていただけませんでしょうか?

Aベストアンサー

ArrayList li = new ArrayList(list);
でよいでのでは?

QOperaでGoogleマップのエラー

Operaの最新版を3日前まで使っていて、快調にGoogleマップも表示出来ていました。ただ、なぜか突然にGoogleマップのページに入るとフリーズするよになり…現在ではHPの埋込も表示できなくなってしまいました。
GoogleChromeも、同様に…マイマップを表示させようとするとフリーズするようになりました。
他の普通のページでは、OperaもGoogleChromeも特に問題はないのです。

IEやFireFox、SafariではもちろんGoogleマップは動いています。
Googleマップの正式な作動環境はIE,FireFox,Safariであることは承知していますが、つい先週までOperaでもGoogleChromeでも快調&軽快&快速に表示出来ていたので、自分で何か相性の悪いソフトをインストールしてしまったのか?と悔やんでいます。

OperaもGoogleChromeも作動が軽快なだけに、できればどちらかを活用したいのですが…Googleマップ以外はまぁ快適なのですが、Googleマップはかなりほとんど毎日毎回アクセスするので、その度毎にFierFoxを起動したりSafariを起動したりなど、ちょっと無念です。

OSはXP(sp3)です。

アンイストールソフトを使って削除して、再インストールしてもレジストリクリーナーを使ってみても、状況は改善しませんでした。
3年ほど同じパソコンを使っているので、そろそろOSから再インストールして再構築の時期でもあるのか?とも考えています…どうせならWin7へとも(ハードウェアでは問題ないようです、メモリもCPUも)。

Operaの最新版を3日前まで使っていて、快調にGoogleマップも表示出来ていました。ただ、なぜか突然にGoogleマップのページに入るとフリーズするよになり…現在ではHPの埋込も表示できなくなってしまいました。
GoogleChromeも、同様に…マイマップを表示させようとするとフリーズするようになりました。
他の普通のページでは、OperaもGoogleChromeも特に問題はないのです。

IEやFireFox、SafariではもちろんGoogleマップは動いています。
Googleマップの正式な作動環境はIE,FireFox,Safariであることは承知し...続きを読む

Aベストアンサー

確かに「Twitter」のほうでも、ここ数日内で
Opera10.51 でGoogleマップを見ると固まる、とか
Opera10.51 でGoogleマップがハングアップするようになった、などのつぶやきはあがってますね。
原因まではわかりませんが、一応情報まで。

尚、当方のWindows XP SP3 Opera10.51では今のところとくに問題は出てません。

QHashMap(J2SDK1.4.2_09)について

import java.util.*;

class BubbleSort {
public static void Sort(double[] a) {

HashMap hmap = new HashMap(); // ☆
int m, i, j;
double n, t;

for(i=0; i<a.length; i++) {
hmap.put(a[i], i); // (1)
}

for(i=0; i<a.length; i++) {
m = hmap.get(a[i]); // (2)
if(m >= 9) {
System.out.println("キー " + (m+1) + " の値=" + a[i]);
}
else {
System.out.println("キー " + (m+1) + " の 値=" + a[i]);
}
}
}

public static void main(String args[]) {

double[] a = {7.6, 7.8, 5.6, 4.1, 0.3, 9.9, 1.5, 8.1, 7.1, 5.3};

Sort(a);
}
}


上記のように、(1)ではkey(main文にある各配列要素)をvalue(keyの要素に対応する番号)に対応付けする、(2)では指定したキーに対応した値を返す、といったことをしたいのですが、エラーが出てしまいコンパイルできません。J2SDK5.0では、☆の部分を、

HashMap<Double,Integer> hmap = new HashMap<Double,Integer>();

のようにすればコンパイル、実行できます。しかし事情があって1.4でしたいのです。どのようにすればできるでしょうか?宜しくお願いします。

import java.util.*;

class BubbleSort {
public static void Sort(double[] a) {

HashMap hmap = new HashMap(); // ☆
int m, i, j;
double n, t;

for(i=0; i<a.length; i++) {
hmap.put(a[i], i); // (1)
}

for(i=0; i<a.length; i++) {
m = hmap.get(a[i]); // (2)
if(m >= 9) {
System.out.println("キー " + (m+1) + " の値=" + a[i]);
}
else {
System.out.println("キー " + (m+1...続きを読む

Aベストアンサー

下記のように書いてみて下さい。
注意事項としては、HashMapクラスに格納できるのは、キー、値とも、Objectクラスのサブクラスだけです。
ですので、intとかdoubleとか、プリミティブな変数は格納できません。
下記では、キー、値ともに、Stringクラスに変換してから格納しています。

public static void Sort(double[] a) {

HashMap hmap = new HashMap(); // ☆
int m, i, j;
double n, t;

for(i=0; i<a.length; i++) {
hmap.put(Double.toString(a[i]), Integer.toString(i));
}

for(i=0; i<a.length; i++) {
m = Integer.parseInt((String)hmap.get(Double.toString(a[i]))));
if(m >= 9) {
System.out.println("キー " + (m+1) + " の値=" + a[i]);
} else {
System.out.println("キー " + (m+1) + " の 値=" + a[i]);
}
}
}

下記のように書いてみて下さい。
注意事項としては、HashMapクラスに格納できるのは、キー、値とも、Objectクラスのサブクラスだけです。
ですので、intとかdoubleとか、プリミティブな変数は格納できません。
下記では、キー、値ともに、Stringクラスに変換してから格納しています。

public static void Sort(double[] a) {

HashMap hmap = new HashMap(); // ☆
int m, i, j;
double n, t;

for(i=0; i<a.length; i++) {
hmap.put(Double.toString(a[i]), Integer.toStrin...続きを読む

Qgoogleマップにajax

googleマップにajax、php、mysqlを使って複数マーカを表示したい場合
googleマップの地図をマウスで動かすごとにmysqlのSqlを実行しデータ
を抽出してgoogleマップに表示しているのでしょうか。

Aベストアンサー

おそらく表示件数によってスキームを変えている連中が多いんじゃないかな?

件数が少ない(マップ内に15~6件程度)場合
dragEndでそのままajax取得->表示

件数が多い場合
初期値として、バウンダリの9倍面積のエリア分の物件状況をajaxで内部配列に取得
dragEndで内部配列から表示、同時にバウンダリの9倍のエリア分の物件状況をajaxで内部配列に取得

件数が多い場合、ちょっとしたDragで全件再取得は苦しい。
体感速度を上げるためには、ない知恵を使うしかないです。

Q2次元の配列となっているクラス(HashMap)から指定の要素を検索する方法

HashMap[] seminar_list;
seminar_list = dbControl.get_SEMINAR_LIST();

という形で以下のような表形式のデータをseminar_listにセットしました。
------------------
IDCATEGORY
001aaa
002bbb
003bbb
------------------

1次元の配列であれば、配列の位置を検索できることを確認できましたが、2次元の場合はどのように検索を行えばよいのでしょうか?

行いたいことは、ID:001のCATEGORYの値 を取得するようなプログラムを作成したいと思っています。
以下のようなプログラムを作成しましたが、(1)のところでエラー
(java.lang.ClassCastException)となってしまいました。

===========================================================================
Arrays.sort(seminar_list); (1)
int seminar001_index = Arrays.binarySearch(seminar_list, "001"); (2)
String cate001 = (String)seminar_list2[cate001_index].get("CATEGORY"); (3)
===========================================================================

よろしくお願いいたします。

HashMap[] seminar_list;
seminar_list = dbControl.get_SEMINAR_LIST();

という形で以下のような表形式のデータをseminar_listにセットしました。
------------------
IDCATEGORY
001aaa
002bbb
003bbb
------------------

1次元の配列であれば、配列の位置を検索できることを確認できましたが、2次元の場合はどのように検索を行えばよいのでしょうか?

行いたいことは、ID:001のCATEGORYの値 を取得するようなプログラムを作成したいと思っています。
以下のようなプログラムを作成しましたが...続きを読む

Aベストアンサー

2次元配列というのは
int[][] num = new int[3][4];
こういう風に配列の中に配列があるものです。

それは置いといて。
IDとCategoryがHashMap[]にどういう風に入ってるか気になりますね

seminar_list[0].put("001","aaa");
seminar_list[1].put("002","aaa");

もしかしてこんな感じですか?
これなら配列にする必要はないですね。
seminar_list.put("001","aaa");
seminar_list.put("002","bbb");
でOK

他の質問でもありましたが、なぜHashMapを配列に・・・。

あと、蛇足ですが

public IDComparator implements Comparator{
public int compareTo(HashMap map1,HashMap map2){
String str1 = null;
String str2 = null;
for(int i=0;i<3;i++){
String id = "00" + (i+1);
str1 = map1.get(id);
if(str1 != null) break;
}
//上記と同じことをmap2でも実行
int num1,num2;
if(str1.equals("aaa")) num1 = 1;
//上記と同様に"bbb"のときnum1 = 2;のようにし、
    //num2でも繰り返す。
return num1 - num2;
}
}
というクラスを作って
質問の(1)の上の行に
Comarator c = new IDComparator();
ほいで(1)を
Arrays.sort(seminar_list,c);
とすると "sortは" うまくいきます。が、残念ながら次の行で死にます
hiroaki213さんが指摘されたようにすると次の行もうまくいきます。
何でうまくいかないのかわからないなら、今はほっとくというのも手です。僕は実際Comparatorを使うまではさっぱりわかりませんでした。

ここら辺の面倒臭さがJavaのとっつきにくい理由なんですよね。
経験の浅い人でもキッチリしたプログラムを作れるという利点でもあるのですが。

2次元配列というのは
int[][] num = new int[3][4];
こういう風に配列の中に配列があるものです。

それは置いといて。
IDとCategoryがHashMap[]にどういう風に入ってるか気になりますね

seminar_list[0].put("001","aaa");
seminar_list[1].put("002","aaa");

もしかしてこんな感じですか?
これなら配列にする必要はないですね。
seminar_list.put("001","aaa");
seminar_list.put("002","bbb");
でOK

他の質問でもありましたが、なぜHashMapを配列に・・・。

あと、蛇足ですが

publi...続きを読む

QGoogle マップのマイマップの移行

今までのGoogleMapで作成したマイマップを新しいGoogleMapに一括で移植(インポート)することは可能でしょうか?
(マイプレイスの中にあるマイマップことです)

保存しているマイマップに保存している地図の数がそれなりに多いもので一つ一つ登録をし直すのは少し大変なので、一括でインポートできる方法があればと思い質問させていただきました。

どなたかわかる方がいらっしゃいましたら宜しくお願い致します。

ちなみに今回のGoogleMapはWindows PC版のGoogleMapの話です。

Aベストアンサー

>GoogleMapで作成したマイマップを新しいGoogleMapに一括で移植(インポート)することは可能でしょうか?
参考になるようでしたら活用して下さい。
https://productforums.google.com/forum/#!topic/maps-ja/ol4dCg80IA8

Googlemapsのマイマップにエクセルの住所を一括登録する方法
http://monokoto.jugem.jp/?eid=3912

QArrayListなかへの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;
-省略-
}

スケジュールのプログラムを作成していまして、1日分のオブジェクトをArrayListにいれて、さらに、1日分のArrayLisのオブジェクトを1ヶ月のArrayListにいれました。

そこで、1ヶ月のArrayListのオブジェクトから1日のArrayListのオブジェクトに分解して、表示したところに、最後の日にちの件数が表示されました。

1.ArrayListにオブジェクトをいれますと、うまく表示されます。
2.ArrayListにArrayListオブジェクトをいれまして、総件数を表示したら、1日から31日までのArrayListのsizeメソッドが最後の日...続きを読む

Aベストアンサー

 こんばんは。

1:ArrayList monthList=null;
2:
3:for(int count=1; count<=day; count++){
4: monthList=new ArrayList();
5: ArrayList dayList=new ArrayList();
6: dayList=setDay(year,month,count);
7: monthList.add(dayList);
8:}

 4行目はおかしくないですか?
 これでは、forループが回るたびに新しいArrayListのインスタンスを作ってしまいませんか。
 一回転目で1日目のデータを入れても、2回転目には、あたらしいArrayListができてしまい、さっきのArrayListは1日目のデータとともに、ガーベージコレクションの対象になって、消えていってしまいます。
 それを31回繰り返し、結局、31日目のデータを入れた最後のリストが生き残っているように思います。

 あと、5行目も結局6行目でsetDayメソッドから返ってくるArrayListのインスタンスを代入しているので、無駄ですよね。

ArrayList monthList = new ArrayList();

for(int count=1; count<=day; count++){
  ArrayList dayList = setDay(year,month,count);
  monthList.add(dayList);
}

 こうするのが、正しいような気がするのですが・・・、

 こんばんは。

1:ArrayList monthList=null;
2:
3:for(int count=1; count<=day; count++){
4: monthList=new ArrayList();
5: ArrayList dayList=new ArrayList();
6: dayList=setDay(year,month,count);
7: monthList.add(dayList);
8:}

 4行目はおかしくないですか?
 これでは、forループが回るたびに新しいArrayListのインスタンスを作ってしまいませんか。
 一回転目で1日目のデータを入れても、2回転目には、あたらしいArrayListができてしまい、さっきのArrayListは1日目のデー...続きを読む


人気Q&Aランキング

おすすめ情報