🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

Q&A

解決済

3回答

1260閲覧

データクラスにうまく追加できません。java

Takalog

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

0グッド

0クリップ

投稿2021/02/13 09:23

JAVA初心者です。
CSVデータ、10行、5列の最終行のみ数字データのものを
データクラス(About_book)に追加して表示させたいのですが、
for文で入るものは入るのが、入らないものはなぜか
入らないといった状況です。

その後、カプセル化を行いたいと思っております。

java public class Kad { public static void main(String[] args) { //インスタンスメソッド作成 Kad getbookInfo = new Kad(); List<String[]> input = getbookInfo.input_Data(); Kad readBook = new Kad(); List<String> outputData = new ArrayList<String>(); outputData = readBook.outputData(input); Kad displayData = new Kad(); displayData.displayBook(outputData); } private List<String[]> input_Data () { BufferedReader br = null ; String line = null ; List<String[]> input = new ArrayList<String[]>(); try{ InputStreamReader ORS = new InputStreamReader(new FileInputStream(CSV_TITLE), ENCODING); br = new BufferedReader(ORS); while((line = br.readLine()) != null ) { input.add(line.split(","+"\t",-1)); } return input ; } catch (FileNotFoundException e) { System.out.println(NOT_FOUND) ; } catch (IOException e) { System.out.println(IO_ERROR); } catch (Exception e) { System.out.println(ERROR); } finally { try { br.close(); } catch (Exception e) { System.out.println(ERROR); } } return null; } public List<String> outputData (List<String[]> input) { List<String> inputDataList = new ArrayList<String>(); for (String[] line_data : input) { for (int i =0 ; i < line_data.length ; i++) { inputDataList.add(line_data[i]); } } return inputDataList ; } private List<About_book> displayBook(List<String> outputDataList) { List<About_book> inputBookInfo = new ArrayList<About_book>(); for(String OutPut : outputDataList) { String [] input = OutPut.split(","); About_book about_book = new About_book(); for (int i = 0 ; i < input.length ; i++) { if (i == 0) { about_book.setTitle(BRACKET+input[i]+BRACKET_CLOSING); } if (i == 1) { about_book.setName(BRACKET+input[i]+BRACKET_CLOSING); } if (i == 2) { about_book.setStart(BRACKET+input[i]+BRACKET_CLOSING); } if (i == 3) { about_book.setEnd(BRACKET+input[i]+BRACKET_CLOSING); } if (i == 4 ) { about_book.setPrice(Integer.parseInt(input[i])); } inputBookInfo.add(new About_book()); } about_book.showBook(); } return inputBookInfo; } } class About_book { public String title; public String getTitle() { return this.title; } public void setTitle (String title) { this.title = title; } public String name; public String getName() { return this.name; } public void setName (String name) { this.name = name ; } public String start; public String getStart() { return this.start; } public void setStart (String start) { this.title = start; } public String end; public String getEnd() { return this.end; } public void setEnd (String end) { this.title = end; } public int price; public int getPrice() { return this.price; } public void setPrice(int price) { this.price = price ; } public void showBook() { System.out.println("題名:"+title+"、著者:"+name+"、販売開始:"+ start+ "、販売終了:" + end); } public void showPrice() { System.out.println(price); } } コード

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

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

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

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

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

y_waiwai

2021/02/13 09:27

なにがどういうふうに入らないんでしょうか。 意味不明ですよ
Takalog

2021/02/13 09:55

すみませんでした。 データクラスのタイトルは if (i == 0) { about_book.setTitle(BRACKET+input[i]+BRACKET_CLOSING); としているのですが、全くよきせぬ インデックス番号が3や4が i == 0 にひっかかっていまいます。
ykws

2021/02/13 13:28

入力と出力も質問に書いてみてください。
YT0014

2021/02/14 04:35

発生していたのは、常に、題名に販売終了が表示され、販売開始と販売終了がnullとなる、ではないでしょうか?(当方の環境での確認事実) インデックス番号が3や4の時に、i==0の処理に、println()での確認やブレークポイントでの停止は確認されておられますか? 質問には、事実と予想は明確に区別してご提示いただきますよう、お願いいたします。
Takalog

2021/02/14 14:02

なるほど!!!! ご理解していただいたこと、また、 深く考えて頂いて本当にありがとうございます。 私自身1週間以上ここで詰まっていまして本当にお手上げしていて 親身になって解答していただきありがとうございます。 このように書き換えてもやはり同じ結果になってしまうのですが、 また、違うとこに問題があるのでしょうか? public About_book(String outPut) { // TODO 自動生成されたコンストラクター・スタブ } public String getTitle() { return this.title; } public void setTitle (String title) { this.title = title; } public String getName() { return this.name; } public void setName (String name) { title = name ; } public String getStart() { return this.start; } public void setStart (String start) { title = start; } public String getEnd() { return this.end; } public void setEnd (String end) { title = end; } public int getPrice() { return this.price; } public void setPrice(int price) { this.price = price ; }
guest

回答3

0

一旦書いたコードは置いておいて、入力と出力に注目し、実際の入力に対して、出力された結果から、どのような判定をしたらそのような結果になるのか、書いたコードを無視して考えて見てください。

例えば、ものすごく簡略した一例として、以下のような入力と出力があったとします。

  • 入力: 1, 2, 3, 4, 5
  • 出力: 2, 4

この時、期待する結果は、奇数だけを出力したいとします。
実際の結果に注目すると、どうも偶数だけを出力していると推測できます。

このように入力と結果から、偶数と奇数の判定処理が反対になっているのでは、と当たりをつけて見直し、原因の特定が容易になります。

for文で入るものは入るのが、入らないものはなぜか入らないといった状況です。

具体的にどの入力に対して、どの出力結果となっているか、整理してみてください。

投稿2021/02/13 13:39

ykws

総合スコア1242

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

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

0

ベストアンサー

不具合確認したため、追加
根本原因は、以下かもしれません。

java

1 public void setStart(String start) { 2 title = start; 3 } 4 5 public void setEnd(String end) { 6 title = end; 7 }

title(i==0の項目)に、setStart()とsetEnd()で値を設定しています。
なお、こちらで検証した限りでは、以下で指摘した現象も発生します。
追加、ここまで

ifの判定がおかしいのではなく、想定しているデータと、実際に渡されるデータとに齟齬があるのが原因です。

main()で、実際に行われている処理は、以下の通りです。

1.処理クラスのインスタンスを作成。

2.input_Data()
CSVファイルを読み、各行で、カンマ(,)またはタブ(\t)を区切りとした文字列配列を作成し、リストに格納して返す。
CSVファイルを読み、各行で、カンマ(,)タブ(\t)が連続の場合は、それを区切りとした文字列配列を作成し、リストに格納して返す。

3.outputData()
2のリストの文字列配列を、順に、文字列リストに格納。

4.displayBook()
3の配列内の文字列をカンマ(,)毎に区切って表示。

このため、displayBook()で渡されているデータでは、カンマの直後にタブがある場合、行が分割されるので、~~inputは、常に、要素1つの配列になり、CSVのデータは、ずべて、i==0となるので、titleとして表示されます。~~場所がずれる場合があります。

ご提示いただいたコードには、基礎の理解が不足している部分が散見されますので、再度、基礎からの勉強をされることをお勧めします。

投稿2021/02/13 12:13

編集2021/02/14 04:21
YT0014

総合スコア1748

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

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

Takalog

2021/02/13 13:15

ごかいとうありがとうございます。 基礎からまた本で勉強しています。 一応、lengthで長さ調べてあっていて、 更に念の為プリントしてみたら、やはり ぼくが思い描いてた、予想通りの結果が印字されるのですが、 if文でなぜ詰まるのかずっとひっかかってます。
YT0014

2021/02/13 13:20

displayBook()にあるinput.lengthでしょうか?その値は、全データで1になっている、というのが、回答での指摘です。
Takalog

2021/02/13 13:28

displayBook()のfor文の中のinput.lengthです。 そちらが一応5と印字されます。
Takalog

2021/02/13 13:33

なので、読み込みとしてはdisplayBook()で全てできてて、 プリントも可能です。 しかし、if文がうまくできないことがなぜだか理解できなくて質問させていただきました。
YT0014

2021/02/13 13:47 編集

解釈の誤りがあったので回答を修正しました。
momon-ga

2021/02/14 03:14

予想通りとは?どのように表示されますか? displayBookメソッドのループの中で > for(String OutPut : outputDataList) { > String [] input = OutPut.split(","); System.out.println("=== " + OutPut + " =="); として場合に、カンマ区切りのcsv1行分が表示されるという意味ですか?
YT0014

2021/02/14 03:41

想定:Outputが、CSVの1行の文字列で、区切りのカンマが全部含まれている。 実際:カンマタブが含まれていない場合、想定通り。 含まれている場合、カンマタブ毎で分かれるため、CSVの1行が切れ切れになっている。 という解析ですが、実際の入出力データが不明なため、あくまで、コードレビュー結果です。 なお、”予想”だと、想定と実際のどちらを示しているのか不明瞭なため、双方を提示いたします。
Takalog

2021/02/14 09:37

想定:CSVをカンマ区切りで取得して、if文に投げて、保存したい場所にsetXxx()する 実際:CSVはカンマ区切りで一つづつ取り出すことがきているが、if文に投げるとエラーが 発生してしまいます。 〜1行目〜 COBOLプログラム設計入門 構造化を中心として フィリッパキス 9月25日 10月25日 2400 題名:[10月25日]、著者:null、販売開始:null、販売終了:null →ここに上から順番に題名、著者と金額以外を投入したかったです。 改訂新版 SQLポケットリファレンス 朝井淳 9月25日 10月25日 1980 題名:[10月25日]、著者:null、販売開始:null、販売終了:null Linux コマンド ポケットリファレンス 平山智恵 9月25日 10月25日 2280 題名:[10月25日]、著者:null、販売開始:null、販売終了:null
YT0014

2021/02/14 11:09 編集

回答の先頭の追記の通りですが。 1行目の場合、iが0の時、About_bookクラスのsetTitle()で、titleに「COBOL~」が設定される。 iが2の時、setStart()で、誤った変数 title に「9月25日」が設定される。 iが3の時、setEnd()で、誤った変数 title に「10月25日」が設定される。 結果、showBook()にて、題名として、titleの値「10月25日」が表示される。
momon-ga

2021/02/14 11:17 編集

そんな罠が・・・とはいえ、setNameが入っていないので、 やはり1行のデータの想定が誤ってるのは解消できないですねぇ。 outputDataList.size() が、10になっていないと思いますけど・・・
guest

0

else if か switch文を試してみてはどうでしょうか。

投稿2021/02/13 10:04

seastar3

総合スコア2287

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

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

Takalog

2021/02/13 10:32

ありがとうございます。やはり同様の結果になっていまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問