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

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

ただいまの
回答率

88.82%

JAVAでコードを短くする

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 690

boobooboo

score 12

JAVAで
String a1 = 
String a2 = 
のような感じで書いてしまうんですが
for文を使って、まとめたいのですが教えてください。
コード載せます。

追記 だいぶすっきりしました。
whileのところができません。
よろしくお願いします。

        File file1 = new File("c:\\Output");

        if (file1.mkdir()) {
            System.out.println("フォルダの作成に成功しました");
        } else {
            System.out.println("フォルダの作成に失敗しました");
        }


        Connection con = Dao.getConnection();

        PreparedStatement pstmt = con.prepareStatement("SELECT* FROM employee_info WHERE employee_id >= ?");

        pstmt.setInt(1, 0);

        ResultSet rs;

        rs = pstmt.executeQuery();
        /* インスタンス化、ファイルの書き出し */
        List<Entity> list = new ArrayList<Entity>();



            FileWriter f = new FileWriter("C:\\Output\\before.csv", true);
            Entity entity = new Entity();

            while (rs.next()) {

            entity.setEmployee_id(rs.getInt("employee_id"));
            entity.setName(rs.getString("name"));
            entity.setName_hiragana(rs.getString("name_hiragana"));
            entity.setBirthday(rs.getString("birthday"));
            entity.setSex(rs.getInt("sex"));
            entity.setMail_address(rs.getString("mail_address"));
            entity.setTelephone_number(rs.getString("telephone_number"));
            entity.setCompany_info_id(rs.getInt("company_info_id"));
            entity.setHire_date(rs.getString("hire_date"));
            entity.setEnrollment_year(rs.getString("enrollment_year"));
            entity.setEnrollment_month(rs.getString("enrollment_month"));
            entity.setEnrollment_day(rs.getString("enrollment_day"));

            list.add(entity);

            f.write(String.valueOf(entity.getEmployee_id()));
            f.write(",");
            f.write(entity.getName());
            f.write(",");
            f.write(entity.getName_hiragana());
            f.write(",");
            f.write(entity.getBirthday());
            f.write(",");
            f.write(String.valueOf(entity.getSex()));
            f.write(",");
            f.write(entity.getMail_address());
            f.write(",");
            f.write(entity.getTelephone_number());
            f.write(",");
            f.write(String.valueOf(entity.getCompany_info_id()));
            f.write(",");
            f.write(entity.getHire_date());
            f.write(",");
            f.write(entity.getEnrollment_year());
            f.write(",");
            f.write(entity.getEnrollment_month());
            f.write(",");
            f.write(entity.getEnrollment_day());
            f.write(",");
            f.flush();
            f.close();

        }

        rs.close();
        pstmt.close();
        /* 書き出したファイルの読み込み */
        try {
            File ff = new File(
                    "C:\\\\Output\\\\before.csv");
            BufferedReader br = new BufferedReader(new FileReader(ff));

            String line;
            // 1行ずつCSVファイルを読み込む
            while ((line = br.readLine()) != null) {
                String[] data = line.split(",", 0); // 行をカンマ区切りで配列に変換

                Calendar now = Calendar.getInstance();

                int year = now.get(now.YEAR); //年を取得
                int month = now.get(now.MONTH) + 1; //月を取得
                int day = now.get(now.DATE); //日を取得
                // キャスト
                String StrYear = Integer.toString(year); 
                String StrMonth = Integer.toString(month); 
                String StrDay = Integer.toString(day); 
                // 読み込んでリスト化したもので入社日を取り出す
                String[] HireDate = new String[5];
                HireDate[0] = data[8];
                HireDate[1] = data[20];
                HireDate[2] = data[32];
                HireDate[3] = data[44];
                HireDate[4] = data[56];
                String[] ReHireDate = new String[5];
                for(int i = 0; i < HireDate.length; i++) {
                    ReHireDate[i] = HireDate[i].replace("-", "/");    
                    System.out.println(ReHireDate[i]);
                }

                // 置換
                int[] Day = new int[5];
                for(int i = 0; i < Day.length; i++) {
                    Day[i] = differenceDays(StrYear + "/" + StrMonth + "/" + StrDay, ReHireDate[i]);
                    System.out.println(Day[i]);
                }

                int[] Mon = new int[5];
                for(int i = 0; i < Mon.length; i++) {
                    Mon[i] = differenceMonth(StrYear + "/" + StrMonth + "/" + StrDay, ReHireDate[i]);
                    System.out.println(Mon[i]);
                }

                int[] Year = new int[5];
                for(int i = 0; i <Year.length; i++) {
                    Year[i] = Mon[i]/ 12;
                    System.out.println(Year[i]);
                }
                int[] YearMonth = new int[5];
                for(int i = 0; i <YearMonth.length; i++) {
                    YearMonth[i] = Mon[i]% 12;
                    System.out.println(YearMonth[i]);
                }

                con.setAutoCommit(false);
                /* 計算したものをデータベース更新 */
                pstmt = con.prepareStatement(
                        "UPDATE employee_info SET enrollment_year = ?,enrollment_month = ?,enrollment_day = ? WHERE employee_id = ?");

                int[] r = new int[5];
                for(int i = 0; i <r.length; i++) {
                    pstmt.setString(1, Year[i] + "年" + YearMonth[i] + "か月");
                    if (YearMonth[i] == 0){
                    pstmt.setString(1, Year[i]+ "年");
                    }
                    pstmt.setInt(2, Mon[i]);
                    pstmt.setInt(3, Day[i]);
                    pstmt.setInt(4, i);
                    pstmt.executeUpdate();    
                    System.out.println(r[i]);
                    }

                /* 更新したデータベースを再度読み込み */
                pstmt = con.prepareStatement("SELECT* FROM employee_info WHERE employee_id >= ?");

                pstmt.setInt(1, 0);

                rs = pstmt.executeQuery();
                /* 読み込んだものをファイルに書き込み */
                while (rs.next()) {

                    new FileWriter(
                            "C:\\\\Output\\after.csv", true);

                    entity.setEmployee_id(rs.getInt("employee_id"));
                    entity.setName(rs.getString("name"));
                    entity.setName_hiragana(rs.getString("name_hiragana"));
                    entity.setBirthday(rs.getString("birthday"));
                    entity.setSex(rs.getInt("sex"));
                    entity.setMail_address(rs.getString("mail_address"));
                    entity.setTelephone_number(rs.getString("telephone_number"));
                    entity.setCompany_info_id(rs.getInt("company_info_id"));
                    entity.setHire_date(rs.getString("hire_date"));
                    entity.setEnrollment_year(rs.getString("enrollment_year"));
                    entity.setEnrollment_month(rs.getString("enrollment_month"));
                    entity.setEnrollment_day(rs.getString("enrollment_day"));

                    list.add(entity);

                    f.write(String.valueOf(entity.getEmployee_id()));
                    f.write(",");
                    f.write(entity.getName());
                    f.write(",");
                    f.write(entity.getName_hiragana());
                    f.write(",");
                    f.write(entity.getBirthday());
                    f.write(",");
                    f.write(String.valueOf(entity.getSex()));
                    f.write(",");
                    f.write(entity.getMail_address());
                    f.write(",");
                    f.write(entity.getTelephone_number());
                    f.write(",");
                    f.write(String.valueOf(entity.getCompany_info_id()));
                    f.write(",");
                    f.write(entity.getHire_date());
                    f.write(",");
                    f.write(entity.getEnrollment_year());
                    f.write(",");
                    f.write(entity.getEnrollment_month());
                    f.write(",");
                    f.write(entity.getEnrollment_day());
                    f.write(",");

                    f.flush();
                    f.close();
ード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/04/08 12:19

    前回のご質問「Javaでコードを短くする技」( https://teratail.com/questions/182697 )からと推測しますが, 何かお試しになったことをお書きください.

    キャンセル

  • m.ts10806

    2019/04/08 12:29

    前の質問とタイトルがほとんど同じです。要件を書いてください。
    質問は編集できますので、正直なところ、前の質問にコードを追記すれば良かっただけのようにも思います。

    キャンセル

  • swordone

    2019/04/08 13:37

    Java8使っちゃいけない縛り?

    キャンセル

  • jimbe

    2019/04/08 19:34

    「できません」ではこちらには何も分かりません.
    出来るだけ具体的に, どのような結果を得たいのか, どのようなコードを書いたらどうなったのか, 等を追記して頂けますか.

    また, 回答にベストアンサーを付けた上で別の質問を追加されては, 終了したのか継続しているのか分かり難くなります. 一つの質問が解決したのでしたら, 別の質問として新たに登録してください. その際はタイトルを単体でも内容が分かる文とし, 古い質問へのリンクを追加して頂ければ, 単独の質問としても, 連続した質問としても機能致します.

    キャンセル

回答 2

+1

無駄が多すぎるので指摘していきます。

  • mainメソッドの最初の最初のwhile文を1ループ終えると、全く同じEntityが12個listに収まります。ほぼ間違いなく意図した動作ではないですよね?
  • Entityというクラスはimport文の中にないので自作クラスだと思うのですが、そっちでtoString()をオーバーライドしておいた方が出力時楽。そうでなくても、どこかで文字列化のメソッドを用意しておくと、上記と合わせて20行は削れる。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

繰り返し(for文)は, 「配列の各要素に変数の値(例:[i])によってアクセスできる」ことを利用する場合が多いと思います.

String a1 = 
String a2 = 

こういった, 番号の付いた変数を定義・設定している箇所を, まず配列にしてみては如何でしょう.

String HireDate1 = data[8];
String HireDate2 = data[20];
String HireDate3 = data[32];
String HireDate4 = data[44];
String HireDate5 = data[56];String[] HireDate = new String[5];
HireDate[0] = data[8];
HireDate[1] = data[20];
HireDate[2] = data[32];
HireDate[3] = data[44];
HireDate[4] = data[56];
String ReHireDate1 = HireDate1.replace("-", "/");
String ReHireDate2 = HireDate2.replace("-", "/");
String ReHireDate3 = HireDate3.replace("-", "/");
String ReHireDate4 = HireDate4.replace("-", "/");
String ReHireDate5 = HireDate5.replace("-", "/");

↓

String[] ReHireDate = new String[5];
ReHireDate[0] = HireDate[0].replace("-", "/");
ReHireDate[1] = HireDate[1].replace("-", "/");
ReHireDate[2] = HireDate[2].replace("-", "/");
ReHireDate[3] = HireDate[3].replace("-", "/");
ReHireDate[4] = HireDate[4].replace("-", "/");

※番号は 1 から付けていらっしゃいますが, 配列は 0 から始まることにご注意ください.

それから, 配列を使っている箇所を for 文に纏められるかをお考え頂くのが良いかと思います.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/08 17:09

    ありがとうございます。大変助かりました。
    そのアイデア使わせていただきます。
    これでだいぶ減らすことができました。
    あとはファイルの読み込み部分をどうやって
    まとめるか苦戦してます。

    キャンセル

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る