久しぶりにゴリゴリとJavaを書いている。
そんな中、以下の様な要件があってJavaで対応することになった。
今回のお題
①テーブル構造はidとnameのみで両方合わせて一意(PK)である
②同一idのnameをまとめてカンマ区切りで表示したい。
データの例としては以下のイメージ。
id | name |
1 | ABC |
1 | DEF |
2 | ABC |
3 | ABC |
3 | DEF |
4 | ABC |
5 | ABC |
6 | ABC |
7 | ABC |
7 | DEF |
7 | GHI |
8 | ABC |
8 | ABC |
9 | ABC |
10 | ABC |
10 | DEF |
これを以下のようにしたいのだ。
1 : ABC,DEF
2 : ABC
3 : ABC,DEF
4 : ABC
5 : ABC
6 : ABC
7 : ABC,DEF,GHI
8 : ABC,ABC
9 : ABC
10 : ABC,DEF
これのロジックを考えるのにハマったのだ。
考えた結果
できなかったのだけど、1つ1つ考えてみて整理した。
1.初回データは前回のデータとして保持する。
2.前回のデータとIDが同じ場合、nameを結合して追加
3.前のデータとIDが違う場合、前のデータを登録(結果として出力)する
4.最後のデータは登録(結果として出力)する
この考えてソースを書いてみた。
まず、データを保持しているItemBean.java。実質DBから取得したデータだと思ってもらいたい。
- public class ItemBean {
- private int id;
- private String name;
- // コンストラクタ
- public ItemBean(int id, String name){
- this.id = id;
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
次に、結果を出力するためのResultBean.java
- public class ResultBean {
- private int id;
- private String name;
- // コンストラクタ
- public ResultBean(){
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
最後に上記2つを使ったメインのロジックと出力クラス。
- import java.util.ArrayList;
- import java.util.List;
- public class Test1_1 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 登録されているデータ
- List<ItemBean> dataList = new ArrayList<ItemBean>();
- dataList.add(new ItemBean(1,"ABC"));
- dataList.add(new ItemBean(1,"DEF"));
- dataList.add(new ItemBean(2,"ABC"));
- dataList.add(new ItemBean(3,"ABC"));
- dataList.add(new ItemBean(3,"DEF"));
- dataList.add(new ItemBean(4,"ABC"));
- dataList.add(new ItemBean(5,"ABC"));
- dataList.add(new ItemBean(6,"ABC"));
- dataList.add(new ItemBean(7,"ABC"));
- dataList.add(new ItemBean(7,"DEF"));
- dataList.add(new ItemBean(7,"GHI"));
- dataList.add(new ItemBean(8,"ABC"));
- dataList.add(new ItemBean(8,"ABC"));
- dataList.add(new ItemBean(9,"ABC"));
- dataList.add(new ItemBean(10,"ABC"));
- dataList.add(new ItemBean(10,"DEF"));
- // 結果取得用のリスト
- List<ResultBean> resultList = new ArrayList<ResultBean>();
- ResultBean result = null;
- ResultBean beforeResult = null;
- for(ItemBean bean : dataList){
- result = new ResultBean();
- result.setId(bean.getId());
- result.setName(bean.getName());
- // 初回
- if(beforeResult == null){
- // 前のデータとして保持
- beforeResult = result;
- } else if(beforeResult.getId() == result.getId()){//前のIDと同じ時
- beforeResult.setName(beforeResult.getName() + "," + result.getName());
- } else if(beforeResult.getId() != result.getId()){//前のIDと違う時
- // 前のデータを登録する
- resultList.add(beforeResult);
- // 前のデータとして保持
- beforeResult = result;
- }
- }
- if(beforeResult != null){
- resultList.add(beforeResult);
- }
- for(ResultBean rslt : resultList){
- System.out.println(rslt.getId() + " : " + rslt.getName());
- }
- }
- }
この出力結果は想定通りとなっている。
1.初回データは前回のデータとして保持する。⇒41行目のif文
2.前回のデータとIDが同じ場合、nameを結合して追加 ⇒46行目のif文
3.前のデータとIDが違う場合、前のデータを登録(結果として出力)する ⇒48行目のif文
4.最後のデータは登録(結果として出力)する ⇒56行目のif文
前のデータの保持は回している中の最後にして、前のIDと同じときは値を設定したらcontinueするのも考えたけど、やりたいこととプログラムを一致させる意味で同じ処理を2回書いている。
こんなんに時間使っているようではまだまだだぜ。
こちらからは以上です。
12時間でわかるJ2EE実践ガイド (J2EE & BEA WebLogic Server)
- 作者: 日本BEAシステムズ
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2002/11
- メディア: 単行本
- クリック: 8回
- この商品を含むブログ (1件) を見る