読者です 読者をやめる 読者になる 読者になる

丸三角四角

IT業界にしがみつく新人SEが立派なプログラマになろうともがく奮闘記

【Java】プログラミングコンテスト用固有処理基底クラス_Ver2

コード更新致しました。

共通の入力関連処理を固有処理基底クラスに全て任せることにしました。以下コードです。

package volume0;

import java.io.File;
import java.util.Scanner;

public abstract class BaseExe {

    /** スキャナー */
    private Scanner scan;

    /** 入力データ */
    private String inData;

    /** コンソール入力処理 */
    public void exeSysIn() {
        try (Scanner scan = new Scanner(System.in)) {
            exeCtrl(scan);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /** ファイル入力処理 */
    public void exeFileIn(String inDataPath) {
        try (Scanner scan = new Scanner(new File(inDataPath))) {
            exeCtrl(scan);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /** 主処理コントロール */
    private void exeCtrl(Scanner scan) throws Exception {
        this.scan = scan;
        execute();
    }

    /** 主処理 */
    protected abstract void execute() throws Exception;

    /** 次行取得 */
    protected String nextLine() {
        return scan.nextLine();
    }

    /** 入力判定 */
    protected boolean judgeInData() {
        return hasNextLine() && isNotEmptyInData();
    }

    /** 次行存在判定 */
    protected boolean hasNextLine() {
        return scan.hasNextLine();
    }

    /** 空文字判定 */
    protected boolean isNotEmptyInData() {
        inData = nextLine();
        return !inData.isEmpty();
    }

    /** 入力データ取得 */
    protected String getInData() throws Exception {
        if (inData.isEmpty())
            throw new Exception("inData is Empty.");
        return inData;
    }
}

ループで回す場合と単純に取得する場合とで使用方法が異なりますが、以前より便利になりました。この固有処理基底クラスの更新に伴って継承していた子クラスに多少変更があるので、それらのコードは随時載せていきます。

テストドライバ継承しているクラスは以下の記事に記載していますので、参考にしてみてください。

dadainu.hateblo.jp

Ver1は以下にありますので、参考までに。

dadainu.hateblo.jp

アルゴリスムで困った時は、以下の本を参考にしてます。Javaに置き換えるのが少々難解ですが、、、