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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

2回答

2318閲覧

Java ファイル読み込みループ内のネスト数を減らしたい

Hyonta

総合スコア36

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2016/05/29 05:06

###実現したいこと
ファイルの読み込みを一行づつ行って、最終的にはoutputLogListというリストに一行書き込むことを目標としたループ処理の中でネストが深くなってしまっているのですが、できるかぎりネスト数を減らしたいと思っています。どのような方法が考えられるでしょうか。

###現在のソースコード

Java

1// 一行づつ読み込みループ開始 2String logLine = reader.readLine(); 3while (logLine != null) { 4 logLineCount++; 5 inputData.setLogLine(logLine); 6 // スタックトレース部ではない 7 if (!logLine.startsWith("\t")) { 8 // 日時のフォーマットが期待通りである 9 if (logLineCheck.isDateFormat(inputData)) { 10 // 指定した期間内である 11 if (logLineCheck.isDateScope(inputData)) { 12 logTargetLineCount++; 13 // タブ区切りオプションが指定されていたら実施 14 if (selectedOption != null 15 && selectedOption.indexOf(Execute.TAB_OPTION) != -1) { 16 option.doTabDelimiter(inputData, inputFileName); 17 } 18 // 出力ログリストへ追加 19 logDate.append(sdfStandard.format(inputData.getLogLineDate())); 20 logDate.append("\t"); 21 logDate.append(logLine); 22 outputLogList.add(logDate.toString()); 23 logDate.setLength(0); 24 } 25 //日時フォーマットが期待通りでない 26 } else { 27 // ログメッセージ出力 28 message.append("入力ファイルの日時フォーマットが定義と一致しないため、次の行を読み込みます。("); 29 message.append(inputFileName); 30 message.append(":"); 31 message.append(logLineCount); 32 message.append("行目)"); 33 logger.warn(message.toString()); 34 message.setLength(0); 35 } 36 //スタックトレース部を読み込んだ 37 } else { 38 // ログメッセージ出力 39 message.append("スタックトレース部分のため、次の行を読み込みます。("); 40 message.append(inputFileName); 41 message.append(":"); 42 message.append(logLineCount); 43 message.append("行目)"); 44 logger.debug(message.toString()); 45 message.setLength(0); 46 } 47 // 次の行を読み込む 48 logLine = reader.readLine(); 49}

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記のように書けばネストを減らせると思います。

JAVA

1if ( logLine.startsWith("\t") ) { 2 /* エラー処理 */ 3 continue; 4} 5if ( !logLineCheck.isDateFormat(inputData) ) { 6 /* エラー処理 */ 7 continue; 8} 9if (!logLineCheck.isDateScope(inputData)) { 10 continue; 11} 12 /* 通常処理 */

投稿2016/05/29 05:15

kei344

総合スコア69407

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

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

Hyonta

2016/05/29 05:37

ありがとうございます!!! continueをうまく使えばこんなにもスッキリするんですね!! 素早い回答でとても助かりました。
guest

0

kei344さんの回答をもとに修正しました。
これで同じ処理になっていますよね?
回答ありがとうございました!

###修正後のソースコード

Java

1// 一行づつ読み込みループ開始 2String logLine = reader.readLine(); 3while (logLine != null) { 4 logLineCount++; 5 inputData.setLogLine(logLine); 6 7 // スタックトレース部の場合、メッセージを出力し次の行へ 8 if (logLine.startsWith("\t")) { 9 message.append("スタックトレース部分のため、次の行を読み込みます。"); 10 message.append(inputFileName); 11 message.append(":"); 12 message.append(logLineCount); 13 message.append("行目)"); 14 logger.debug(message.toString()); 15 message.setLength(0); 16 continue; 17 } 18 // 日時のフォーマットが定義と一致しない場合、メッセージを出力し次の行へ 19 if (!logLineCheck.isDateFormat(inputData)) { 20 message.append("入力ファイルの日時フォーマットが定義と一致しないため、次の行を読み込みます。"); 21 message.append(inputFileName); 22 message.append(":"); 23 message.append(logLineCount); 24 message.append("行目)"); 25 logger.warn(message.toString()); 26 message.setLength(0); 27 continue; 28 } 29 // 指定期間内でない場合、次の行へ 30 if (!logLineCheck.isDateScope(inputData)) { 31 continue; 32 } 33 logTargetLineCount++; 34 // タブ区切りオプション処理 35 if (selectedOption != null && selectedOption.indexOf(Execute.TAB_OPTION) != -1) { 36 option.doTabDelimiter(inputData, inputFileName); 37 } 38 // 出力ログリストへ追加 39 logDate.append(sdfStandard.format(inputData.getLogLineDate())); 40 logDate.append("\t"); 41 logDate.append(logLine); 42 outputLogList.add(logDate.toString()); 43 logDate.setLength(0); 44 45 // 次の行を読み込む 46 logLine = reader.readLine(); 47}

投稿2016/05/29 05:40

編集2016/05/29 07:00
Hyonta

総合スコア36

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

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

kei344

2016/05/29 05:44

> // 指定期間内でない場合、次の行へ ここは if (!logLineCheck.isDateScope(inputData)) になりませんか? あと、回答欄もコードブロック使えますよ。
Hyonta

2016/05/29 07:00

ご指摘ありがとうございます。 修正いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問