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

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

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

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

Q&A

解決済

2回答

1581閲覧

【Java】行の量増し

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2016/05/16 13:33

こんにちは、知恵を貸していただきたいです

以下のようなデータを取得してきます

ブック作成キー 行キー 行VALUE 行数 B001 K001 V001 1 B001 K002 V002 2 B001 K003 V003 3 B001 K003 V004 3 B001 K004 V005 1 B001 K005 V006 2 B002 K006 V007 3 B002 K007 V008 1 B002 K008 NULL 2 B002 K009 V009 4 B002 K010 V010 1

この表を元に以下のような行数を量増しした表を取得したいです
・ブック作成キー・行キーはユニークな値のキーセット
・行VALUEには行数以下の数の値が紐づく(ない場合もある)
・行数分の行のうち、行VALUEをまず出力して
行数 ー 紐づく行VALUEの数分、行VALUEが空の行を複製する
・これをJavaのみで実現する

最終形
ブック作成キー 行キー 行VALUE 行数
B001 K001 V001 1
B001 K002 V002 2
B001 K002 NULL 2
B001 K003 V003 3
B001 K003 NULL 3
B001 K003 NULL 3
B001 K003 V004 3
B001 K003 NULL 3
B001 K003 NULL 3
B001 K004 V005 1
B001 K005 V006 2
B001 K005 NULL 2
B002 K006 V007 3
B002 K006 NULL 3
B002 K006 NULL 3
B002 K007 V008 1
B002 K008 NULL 2
B002 K008 NULL 2
B002 K009 V009 4
B002 K009 NULL 4
B002 K009 NULL 4
B002 K009 NULL 4
B002 K010 V010 1

ループさせてなんやかんやが激しく苦手なので
どなたかご教授願います

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

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

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

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

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

RyotaKondo

2016/05/16 16:09

「ループさせてなんやかんや」がプログラミングだと思うのですが、このままでは丸投げになってしまいますので、わかるところまでコードを書いてください。そもそも、「表」「入力」「出力」の定義はやりたいことごとに変わります。もしくはアルゴリズムだけでよいならばその旨を記入してください。
swordone

2016/05/16 17:05

何を言っているのかわからない上、「行増し」の法則性も全く見えてきません。これではどのようにコードを組めばいいのかすら不明瞭です。
guest

回答2

0

ベストアンサー

ご回答・質問内容へのご指摘をいただきまして、ありがとうございます
今朝スッキリした頭で再考し冗長気味ではございますが解決しましたので
自己解決とさせていただきます

説明不足で申し訳なかったのですが
入力値の取得に使用しているクエリが複雑で修正コストが高そうな上
出力の際に件数分ループさせるだけでいいようなリストを作成することが目的でした

簡単にまとめると
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 /** 9 * @param args 10 */ 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

投稿2016/05/17 16:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

アルゴリズムとしては恐らく以下のようなものをお考えなのではないかと思います。

ただすでに指摘されている通り、これだけだと入出力フォーマットを合わせるところで躓かれるのではと心配します。例えば、必要とされているのが SQL だったりすればほぼすべて書き直しになってしまいます。

少しでも助けになれば良いのですが。。。

https://paiza.io/projects/AebEAJapmAXcJnza0ms3Jg

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 4 String input = 5 "B001 K001 V001 1\n" + 6 "B001 K002 V002 2\n" + 7 "B001 K003 V003 3\n" + 8 "B001 K003 V004 3\n" + 9 "B001 K004 V005 1\n" + 10 "B001 K005 V006 2\n" + 11 "B002 K006 V007 3\n" + 12 "B002 K007 V008 1\n" + 13 "B002 K008 NULL 2\n" + 14 "B002 K009 V009 4\n" + 15 "B002 K010 V010 1\n"; 16 17 // 行で分割 18 String[] lines = input.split("\n", 0); 19 for (int i = 0; i < lines.length; i++) { 20 // 1つ以上の空白文字で分割 21 // items[0] : ブック作成キー 22 // items[1] : 行キー 23 // items[2] : 行VALUE 24 // items[3] : 行数 25 String[] items = lines[i].split(" +", 0); 26 // 行数を数値に直す 27 int row_count = Integer.parseInt(items[3]); 28 // 行数分だけ出力する 29 // 始めの行 (row==0) では行キーを、それ以降では NULL を、 30 // 空白4文字区切りで出力する 31 for(int row = 0; row < row_count; row++) { 32 System.out.println( 33 items[0] + " " + 34 items[1] + " " + 35 (row == 0 ? items[2] : "NULL") + " " + 36 items[3] 37 ); 38 } 39 } 40 } 41}

投稿2016/05/17 05:22

osamu_takeuchi

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問