ご回答・質問内容へのご指摘をいただきまして、ありがとうございます
今朝スッキリした頭で再考し冗長気味ではございますが解決しましたので
自己解決とさせていただきます
説明不足で申し訳なかったのですが
入力値の取得に使用しているクエリが複雑で修正コストが高そうな上
出力の際に件数分ループさせるだけでいいようなリストを作成することが目的でした
簡単にまとめると
1:ブックキー単位の出力データリストは既に作成されている
2:その中で各出力データリストに指定の条件で行をコピーして追加する
3:Javaだけでという縛り
この3点を満たそうとして混乱してしまいました
ご協力に感謝します
本当にありがとうございます
前提が少し間違っていましたので訂正します
・行キーがブレークするまで出力
・行キーがブレークしたタイミングで行数分の行VALUE空値な行をコピーして出力
以下ソースと結果を記載します
Java
1import java.util.ArrayList;
2import java.util.HashMap;
3import java.util.List;
4import java.util.Map;
5
6public class AddRowLoopSample {
7
8 910
11 public static void main(String[] args) {
12
13 //入力値
14 //実際は某SELECTで取得した結果
15 String[][] inArr = {
16 {"B001","K001","V001","1"}
17 ,{"B001","K002","V002","2"}
18 ,{"B001","K003","V003","3"}
19 ,{"B001","K003","V004","3"}
20 ,{"B001","K004","V005","1"}
21 ,{"B001","K005","V006","2"}
22 ,{"B002","K006","V007","3"}
23 ,{"B002","K007","V008","1"}
24 ,{"B002","K008","","2"}
25 ,{"B002","K009","V009","4"}
26 ,{"B002","K010","V010","1"}
27 };
28
29 //各BOOKKEYごとのデータにまとめる
30 //ロジックあり
31 Map<String, List<Row>> res = new HashMap<String, List<Row>>();
32 for(String[] elem: inArr){
33 Row row = new Row();
34 row.setBookKey(elem[0]);
35 row.setRowKey(elem[1]);
36 row.setRowValue(elem[2]);
37 row.setRowCnt(elem[3]);
38
39 List<Row> replaceList = new ArrayList<Row>();
40 if(res.containsKey(elem[0])){
41 replaceList = res.get(elem[0]);
42 }
43 replaceList.add(row);
44 res.put(elem[0], replaceList);
45 }
46
47 //行KEYごとに行数分の行を作成
48 //ロジックなし・・・この部分がわからなかったです
49 for(Map.Entry<String, List<Row>> book : res.entrySet()){
50 List<Row> tempList = new ArrayList<Row>();
51 Row prevRow = new Row();
52 boolean isFirst = true;
53 for(Row row: book.getValue()){
54 if(isFirst){
55 tempList.add(row);
56 isFirst = false;
57 }else{
58 if(!prevRow.getRowKey().equals(row.getRowKey())){
59 tempList.add(row);
60 for(int i = 0;i < Integer.parseInt(row.getRowCnt());i++){
61 tempList.add(getCopyRow(row));
62 }
63 }
64 }
65 prevRow = row;
66 }
67 //最終行について
68 for(int i = 0;i < Integer.parseInt(prevRow.getRowCnt());i++){
69 tempList.add(getCopyRow(prevRow));
70 }
71 //作り終わったリストを入れ替える
72 res.put(book.getKey(), tempList);
73 }
74
75 //出力結果確認
76 //実際はBOOKKEY分のEXCELファイルを作成
77 //中のシートにMapのValueに格納しているリスト分の行を出力
78 for(Map.Entry<String, List<Row>> book : res.entrySet()){
79 for(Row row: book.getValue()){
80 System.out.println(row.getBookKey() + " " + row.getRowKey() + " " + row.getRowValue() + " " + row.getRowCnt());
81 }
82 }
83
84 }
85
86 private static Row getCopyRow(Row row){
87 Row ret = new Row();
88 ret.setBookKey(row.getBookKey());
89 ret.setRowKey(row.getRowKey());
90 ret.setRowValue("");
91 ret.setRowCnt(row.getRowCnt());
92 return ret;
93 }
94
95}
96
Java
1public class Row {
2 private String bookKey;
3 private String rowKey;
4 private String rowValue;
5 private String rowCnt;
6 public String getBookKey() {
7 return bookKey;
8 }
9 public void setBookKey(String bookKey) {
10 this.bookKey = bookKey;
11 }
12 public String getRowKey() {
13 return rowKey;
14 }
15 public void setRowKey(String rowKey) {
16 this.rowKey = rowKey;
17 }
18 public String getRowValue() {
19 return rowValue;
20 }
21 public void setRowValue(String rowValue) {
22 this.rowValue = rowValue;
23 }
24 public String getRowCnt() {
25 return rowCnt;
26 }
27 public void setRowCnt(String rowCnt) {
28 this.rowCnt = rowCnt;
29 }
30}
31
出力結果
B001 K001 V001 1
B001 K002 V002 2
B001 K002 2
B001 K002 2
B001 K003 V003 3
B001 K003 3
B001 K003 3
B001 K003 3
B001 K004 V005 1
B001 K004 1
B001 K005 V006 2
B001 K005 2
B001 K005 2
B001 K005 2
B001 K005 2
B002 K006 V007 3
B002 K007 V008 1
B002 K007 1
B002 K008 2
B002 K008 2
B002 K008 2
B002 K009 V009 4
B002 K009 4
B002 K009 4
B002 K009 4
B002 K009 4
B002 K010 V010 1
B002 K010 1
B002 K010 1