社員CRUDシステム実装

こんばんは。てんぷらマインドちゃこです。

本日は、昨日のJavaの課題を2人別々に実装していました。
一旦ちゃこの方のプログラムが形になってきたので載せておきます。

昨日出した課題はこちら↓
f:id:tempuraMind569:20200619191356p:plain

ソースコード

package jp.co.tempuraMind;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Main {

  public static void main(String[] args) {

    // 1:社員一覧表示
    final int MENU_NUMBER_LIST = 1;
    final String MENU_STRING_LIST = "社員一覧表示";

    // 2:社員登録
    final int MENU_NUMBER_REGISTER = 2;
    final String MENU_STRING_REGISTER = "社員登録";

    // 3:社員情報編集
    final int MENU_NUMBER_UPDATE = 3;
    final String MENU_STRING_UPDATE = "社員情報編集";

    // 4:社員情報削除
    final int MENU_NUMBER_DELETE = 4;
    final String MENU_STRING_DELETE = "社員情報削除";

    // 5:終了
    final int MENU_NUMBER_FINISH = 5;
    final String MENU_STRING_FINISH = "終了";

    // メニュー管理マップ作成
    final Map<Integer, String> menuMap = new LinkedHashMap<Integer, String>();
    menuMap.put(MENU_NUMBER_LIST, MENU_STRING_LIST);
    menuMap.put(MENU_NUMBER_REGISTER, MENU_STRING_REGISTER);
    menuMap.put(MENU_NUMBER_UPDATE, MENU_STRING_UPDATE);
    menuMap.put(MENU_NUMBER_DELETE, MENU_STRING_DELETE);
    menuMap.put(MENU_NUMBER_FINISH, MENU_STRING_FINISH);

    // ファイル名
    final String FILE_NAME = "shine.txt";

    // ユーザー入力
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    boolean hasInputError = false;
    int menuNum = 0;
    boolean isContinued = true;
    boolean isNotFirst = false;

    while (isContinued) {
      // メニュー表示
      if(isNotFirst){
        System.out.println();
      }
      System.out.println("メニューを選択してください");
      for (Integer menu : menuMap.keySet()) {
        System.out.println(menu + ":" + menuMap.get(menu));
      }

      // 入力エラーがある限り入力させ続ける
      do {
        hasInputError = false;
        System.out.print(">");
        try {
          String menuStr = br.readLine();
          menuNum = Integer.parseInt(menuStr);
        } catch (Exception e) {
          // e.printStackTrace();
          System.out.println("半角数字を入力してください。");
          hasInputError = true;
        }
      } while (hasInputError);

      isNotFirst = true;
      // 選択されたメニューに対する処理を行う
      switch (menuNum) {

      // 社員一覧を表示
      case MENU_NUMBER_LIST:
        File file = new File(FILE_NAME);
        try {
          BufferedReader fbr = new BufferedReader(new FileReader(file));
          List<String> shineList = new ArrayList<String>();

          // txtファイルから一行ずつ読み出し
          for (;;) {
            String shine = fbr.readLine();
            if (shine != null) {
              shineList.add(shine);
            } else {
              break;
            }
          }

          for (int i = 0; i < shineList.size(); i++) {
            System.out.println(i + 1 + "." + shineList.get(i));
          }

        } catch (FileNotFoundException e) {
          System.out.println("ファイルの読み込みに失敗しました");
          e.printStackTrace();
        } catch (IOException e) {
          // TODO 自動生成された catch ブロック
          e.printStackTrace();
        }
        break;

      // 社員情報登録
      case MENU_NUMBER_REGISTER:
        System.out.println("社員情報を入力してください");
        String shine = "";

        // 入力エラーがある限り入力させ続ける
        do {
          hasInputError = false;
          System.out.print(">");
          try {
            shine = br.readLine();

            // 改行コード追加
            shine += "\r\n";
          } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
            System.out.println("入力エラーです。もう一度入力してください。");
          }
        } while (hasInputError);

        // ファイルに書き込み
        try {
          file = new File(FILE_NAME);
          FileWriter fileWriter = new FileWriter(file, true);
          fileWriter.write(shine);
          fileWriter.flush();
        } catch (IOException e) {
          e.printStackTrace();
        }

        break;

      // 社員情報変更
      case MENU_NUMBER_UPDATE:
        // ファイル読み出し
        file = new File(FILE_NAME);
        List<String> shineList = new ArrayList<String>();
        try {
          BufferedReader fbr = new BufferedReader(new FileReader(file));

          // txtファイルから一行ずつ読み出し
          for (;;) {
            shine = fbr.readLine();
            if (shine != null) {
              shineList.add(shine);
            } else {
              break;
            }
          }

          for (int i = 0; i < shineList.size(); i++) {
            System.out.println(i + 1 + "." + shineList.get(i));
          }

        } catch (FileNotFoundException e) {
          System.out.println("ファイルの読み込みに失敗しました");
          e.printStackTrace();
        } catch (IOException e) {
          // TODO 自動生成された catch ブロック
          e.printStackTrace();
        }

        System.out.println("編集する社員の番号を選択してください");

        // 番号選択
        String updateNumStr = "";
        int updateNum = 0;
        // 入力エラーがある限り入力させ続ける
        do {
          hasInputError = false;
          System.out.print(">");
          try {
            updateNumStr = br.readLine();
            updateNum = Integer.parseInt(updateNumStr);

          } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
            System.out.println("入力エラーです。半角数字を入力してください。");
          }
        } while (hasInputError);

        // 編集文言入力
        String updateStr = "";
        // 入力エラーがある限り入力させ続ける
        do {
          hasInputError = false;
          System.out.print(">");
          try {
            updateStr = br.readLine();

          } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
            System.out.println("入力エラーです。もう一度入力してください。");
          }
        } while (hasInputError);

        // ファイルに書き込み
        shineList.set(updateNum - 1, updateStr);
        try {
          file = new File(FILE_NAME);
          FileWriter fileWriter = new FileWriter(file);
          for (int i = 0; i < shineList.size(); i++) {
            shine = shineList.get(i) + "\n";
            fileWriter.write(shine);
          }
          fileWriter.flush();
        } catch (IOException e) {
          e.printStackTrace();
        }

        break;

      // 社員情報削除
      case MENU_NUMBER_DELETE:
        // ファイル読み出し
        file = new File(FILE_NAME);
        shineList = new ArrayList<String>();
        try {
          BufferedReader fbr = new BufferedReader(new FileReader(file));

          // txtファイルから一行ずつ読み出し
          for (;;) {
            shine = fbr.readLine();
            if (shine != null) {
              shineList.add(shine);
            } else {
              break;
            }
          }

          for (int i = 0; i < shineList.size(); i++) {
            System.out.println(i + 1 + "." + shineList.get(i));
          }

        } catch (FileNotFoundException e) {
          System.out.println("ファイルの読み込みに失敗しました");
          e.printStackTrace();
        } catch (IOException e) {
          // TODO 自動生成された catch ブロック
          e.printStackTrace();
        }

        System.out.println("削除する社員の番号を選択してください");

        // 番号選択
        String deleteNumStr = "";
        int deleteNum = 0;
        // 入力エラーがある限り入力させ続ける
        do {
          hasInputError = false;
          System.out.print(">");
          try {
            deleteNumStr = br.readLine();
            deleteNum = Integer.parseInt(deleteNumStr);

          } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
            System.out.println("入力エラーです。半角数字を入力してください。");
          }
        } while (hasInputError);

        // ファイルに書き込み
        shineList.remove(deleteNum - 1);
        try {
          file = new File(FILE_NAME);
          FileWriter fileWriter = new FileWriter(file);
          for (int i = 0; i < shineList.size(); i++) {
            shine = shineList.get(i) + "\n";
            fileWriter.write(shine);
          }
          fileWriter.flush();
        } catch (IOException e) {
          e.printStackTrace();
        }

        break;

      case MENU_NUMBER_FINISH:
        System.out.println("プログラムを終了します。");
        isContinued = false;

      }
    }
  }

}

実行の様子はこんな感じです↓

f:id:tempuraMind569:20200619193036p:plain
たのしいZEXAL社

思いつくままに上から下にガーッと実装していったのでごちゃごちゃしています...。
ファイルから読み出すところとか、共通化するのをさぼってコピペ乱用なので、明日はソースを綺麗にしていこうと思います。

ちなみに今回のソース実装にあたり、LinkedHashMapというものを初めて知りました。
挿入した順番を保持してくれるMapだそうです。
あとは、変数名を考える時に使えるサイトを見つけたのでこちらもメモメモ。
codic.jp

あっ!あと全然関係ないですが遊戯王OCGのテーマ投票が始まりました!
よかったら是非光天使に入れてください!!ドルベさんのファンデッキで戦いたい...。
https://www.db.yugioh-card.com/yugiohdb/


※投票にはKONAMI IDが必要です


今日の担当はちゃこでした。
うみのソースがどんな感じになるのかも楽しみにしていてください~。ではでは。