[Java] 38 現在日時の文字列化

ファイル名作成のため現在日時を文字列化しました。Pythonより楽でした。

これで自製競馬データベースの検索結果をHTMLファイル化するコード作成が終わりました。ようやくJavaFXを使ったGUIアプリ作成に取り掛かることができます。

同じ内容のPythonコードは約100行、Javaで書くと300行位ですから3倍に膨れ上がっています。

Javaは波カッコが苦手で敬遠していましたが、開きカッコ、閉じカッコともに行末に置くことで目立たなくしたのが効果的でした。カッコの色がペアによって異なるようにするVScodeの拡張機能”Bracket Pair Colorizer”のおかげです。

一連の学習で初心者から初級者レベルになれたかと思います。

このまま予定通りGUIアプリ作成に進むか、余勢を駆ってJavaScriptの学習に取り組むか考えているところです。

import java.util.Date;
import java.text.SimpleDateFormat;

// 現在日時を作成
Date dateObj = new Date();
SimpleDateFormat dFormat = new SimpleDateFormat( "yyMMddHHmm" );
String now = dFormat.format(dateObj);

// ファイル名を作成
String filename = String.format("%s_%s.html",now,name);

[Java] 37 戻り値を複数にしたい場合の対応

戻り値は複数にできないためデータ型が同じであればArrayListにまとめます。

今回は競走馬名と競走馬IDを引き継ぎたかったので、ArrayListにまとめて戻り値としました。

第1メソッドで作成したnameとIDをmainメソッドで共有し、IDは第2メソッド、
nameは第4メソッドで使用する

<importは省略>

public class AppTest {
    static String url = "jdbc:mysql://localhost:3306";
    static String user = "ユーザ名";
    static String password = "パスワード";

    public static void main(String args[]) {
        ArrayList<String> nameAndID = IDSearch();
        ArrayList<ArrayList<String>> raceList = raceSearch(nameAndID);
        ArrayList<ArrayList<String>> raceListCon = raceSearch2(raceList);
        // 第4メソッドで競走馬名を使うためnameAndIDを引数に追加
        toHTML(raceListCon,nameAndID);}

    // 第1メソッド
    public static ArrayList<String> IDSearch() {
        
        <中略>

        if (IDList.size() >= 2){
            System.out.println("該当する馬が複数います。番号を入力してください。");
            int i = 1;
            for (String s : IDList) {
                System.out.println(i + " " + s);
                i = i + 1;}

            InputStreamReader isr2 = new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);

            String num = null;
            try {
                num = br2.readLine();}
            catch (IOException e) {
                e.printStackTrace();}

            Integer numInt = Integer.parseInt(num);
            String ID = IDList.get(numInt - 1);
            System.out.println("該当馬のIDは" + ID + "です");
            
            // 競走馬名と競走馬IDをArrayListにまとめる
            ArrayList<String> nameAndID = new ArrayList<String>();
            nameAndID.add(name);
            nameAndID.add(ID);

            return nameAndID;}

        else if (IDList.size() == 0){
            System.out.println("該当する馬はいません");
            ArrayList<String> nameAndID = null;
            System.exit(0);

            return nameAndID;}

        else {
            String ID = IDList.get(0);
            System.out.println("該当馬のIDは" + ID + "です");
            ArrayList<String> nameAndID = new ArrayList<String>();
            nameAndID.add(name);
            nameAndID.add(ID);

            return nameAndID;}}

    // 第2メソッド
    public static ArrayList<ArrayList<String>> raceSearch(ArrayList<String> nameAndID) {
        System.out.println("第2メソッド内出力 " + nameAndID);

        // 引き継いだArrayListから競走馬IDを取り出す
        String ID = nameAndID.get(1);
        System.out.println("ID " + ID);

        String birthYear = ID.substring(0,4);
        Integer birthYearInt = Integer.parseInt(birthYear);
        Integer startYear = birthYearInt + 2;

        System.out.println("最速デビュー年 " + startYear);

        <中略>

    // 第4メソッド
    public static void toHTML(ArrayList<ArrayList<String>> raceListCon,\
    ArrayList<String> nameAndID) {
        System.out.println("第4メソッド内出力1 " + raceListCon + \
        "第4メソッド内出力2 " + nameAndID);

[Java] 36 ArrayListからHTMLファイルを作成

[macOS Catalina 10.15.7]

[Java] 33の続きです。

Pythonにおけるpandasのような気の利いたライブラリはないようなので、HTMLコードを1行にベタ書きさせました。

作成したHTMLファイルはVScodeで開き、以下のショートカットで自動整形できます。
⌘ + K → ⌘ + F

StringBuilderは文字列にスペースが含まれていると結合できないため、文字とスペースを分割して結合させます。

<途中から>

StringBuilder HTMLcode = new StringBuilder();

Integer count = 1;
HTMLcode.append("<table" + " " + "border='1'" + " " + "class='dataframe'>" + "<thead><tr>");
for (ArrayList<String> raceList: raceListConSorts){
    // 1行目はヘッダ
    if (count == 1){
        for (int i = 0 ; i < raceList.size() ; i++){
            HTMLcode.append("<th>" + raceList.get(i) + "</th>");}
        HTMLcode.append("</tr></thead><tbody>");
        HTMLcode.append("<tr>");
        count = count + 1;
    else{
        for (int i2 = 0 ; i2 < raceList.size() ; i2++){
            HTMLcode.append("<td>" + raceList.get(i2) + "</td>");}
        HTMLcode.append("</tr>");}}
HTMLcode.append("</tbody></table>");

try{
    File file = new File("test.html");
    FileWriter filewriter = new FileWriter(file);
    filewriter.write(HTMLcode.toString());
    filewriter.close();}
catch(IOException e){
    System.out.println(e);}}}
--------------------------------------------------

HTMLコードの内容
--------------------------------------------------
<table border='1' class='dataframe'><thead><tr><th>日付</th><th>開催</th>\
<th>天候</th><th>レース</th><th>レース名</th><th>枠番</th><th>馬番</th>\
<th>単勝</th><th>人気</th><th>着順</th><th>騎手</th><th>斤量</th><th>コース</th>\
<th>馬場状態</th><th>タイム</th><th>通過</th><th>上り</th><th>馬体重</th>\
<th>1着馬</th><th>賞金</th><th>raceID</th></tr></thead><tbody><tr>\
<td>2020-10-25</td><td>4回京都6日目</td><td>天候 : 晴</td><td>5 R</td>\
<td>2歳新馬</td><td>7</td><td>13</td><td>2.3</td><td>1</td><td>1</td>\
<td>福永祐一</td><td>55.0</td><td>芝右 外1800m</td><td>芝 : 良</td><td>1:49.9</td>\
<td>6-4</td><td>34.6</td><td>450(0)</td><td>シャフリヤール</td><td>700.0</td>\
<td>r202008040605</td></tr><td>2021-02-14</td><td>1回東京6日目</td><td>天候 : 晴</td>\
<td>11 R</td><td>第55回共同通信杯(G3)</td><td>8</td><td>11</td><td>4.9</td>\
<td>2</td><td>3</td><td>福永祐一</td><td>56.0</td><td>芝左1800m</td><td>芝 : 良</td>\
<td>1:48.0</td><td>7-8-8</td><td>33.4</td><td>448(-2)</td><td>エフフォーリア</td>\
<td>956.1</td><td>r202105010611</td></tr><td>2021-03-27</td><td>2回阪神1日目</td>\
<td>天候 : 晴</td><td>11 R</td><td>第68回毎日杯(G3)</td><td>6</td><td>6</td>\
<td>2.9</td><td>2</td><td>1</td><td>川田将雅</td><td>56.0</td><td>芝右 外1800m</td>\
<td>芝 : 良</td><td>1:43.9</td><td>4-4</td><td>34.1</td><td>448(0)</td>\
<td>シャフリヤール</td><td>3,833.6</td><td>r202109020111</td></tr></tbody></table>

[Java] 35 エラー”Lambda expressions are allowed only at source level 1.8 or above”

前回記事でStream APIを動かそうとしたら表題のエラーが出ました。

Mavenの設定ファイル pom.xmlを適当なJDKのバージョン番号に修正するとあっさり直りました。

デフォルトでは1.7になるのですが、これはMavenの設定のようです。

// Java11コンパイラに設定

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

[Java] 34 Stream APIの使用例

Java8から導入されたとのこと。

前回のコードでとりあえず動かしてみました。

レース名のフリーワード検索に使えそうです。

// リストからレース名に"天皇賞"を含むデータを抽出して出力する
raceListConSorts.stream()
    .filter(racedata -> (racedata.get(4)).contains("天皇賞"))
    .forEach(racedata -> System.out.println(racedata));
--------------------------------------------------

出力
--------------------------------------------------
[2016-05-01, 3回京都4日目, 天候 : 晴, 11 R, 第153回天皇賞(春)(G1), 1, 1, 4.5, 2, 1, 武豊, 58.0, 芝右 外3200m, 芝 : 良, 3:15.3, 1-1-1-1, 35.0, 524(0), キタサンブラック, 15,378.0, r201608030411]
[2017-04-30, 3回京都4日目, 天候 : 晴, 11 R, 第155回天皇賞(春)(G1), 2, 3, 2.2, 1, 1, 武豊, 58.0, 芝右 外3200m, 芝 : 良, 3:12.5, 2-2-2-1, 35.3, 536(-4), キタサンブラック, 15,365.4, r201708030411]
[2017-10-29, 4回東京9日目, 天候 : 雨, 11 R, 第156回天皇賞(秋)(G1), 4, 7, 3.1, 1, 1, 武豊, 58.0, 芝左2000m, 芝 : 不良, 2:08.3, 11-5-2, 38.5, 542(0), キタサンブラック, 15,382.2, r201705040911]