[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]

[Java] 33 ネストしたArrayList内のListを並べ替え

前回の続きです。

レースデータを日付でソートするのを忘れていました。

Pythonであればデータフレームに変換して、ラムダ関数でキーとなる列を指定しsorted関数で処理します。

今回は各レースデータリストから日付を抽出しこれらを昇順ソートした日付リストを作成、for文で日付リストから順次日付を取り出して、日付が一致するレースデータを空リストに追加していきました。

import java.util.Collections;

<途中から>

// リスト内リストの並べ替え
ArrayList<String> dateList = new ArrayList<String>();
for (ArrayList<String> raceData : raceListCon){
    dateList.add(raceData.get(0));}

Collections.sort(dateList);
System.out.println(dateList);

ArrayList<ArrayList<String>> raceListConSortsPre = new ArrayList<ArrayList<String>>();
for (String date : dateList){
    for (ArrayList<String> contents : raceListCon){
        String dateContent = contents.get(0);
        if (dateContent == date){
            raceListConSortsPre.add(contents);}}}

System.out.println(raceListConSortsPre);

[Java] 32 ArrayListの要素を並べ替え

前回の続きです。

結合させたレースデータの要素を並べ替えます。Pythonではpandasでデータフレームに変換してカラム名でreindexの簡単な処理です。

今回は各要素に付番し、呼び出す順番にインデックス番号を並べたリストを作って要素を取り出しました。原始的な方法です。

これでCSV化あるいはHTML化の準備が整いましたが、ざっと調べた感じでは一筋縄ではいかなさそうです。

<第3メソッドまでは省略>

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

    ArrayList<ArrayList<String>> raceListConSorts = new ArrayList<ArrayList<String>>();
    Integer[] indexes = {0,1,5,2,3,9,10,16,17,8,12,11,4,6,13,14,15,18,7,19,20};
    for (ArrayList<String> contents : raceListCon){
        ArrayList<String> raceListConSort = new ArrayList<String>();
        for (Integer i:indexes){
            String element = contents.get(i);
            raceListConSort.add(element);}

        raceListConSorts.add(raceListConSort);}

    ArrayList<String> columnNames = new ArrayList<String>();
    String[] columnName = {"日付","開催","天候","レース","レース名","枠番","馬番","単勝","人気","着順","騎手","斤量","コース","馬場状態","タイム","通過","上り","馬体重","1着馬","賞金","raceID"};

    for (String colname : columnName){
        columnNames.add(colname);}

    System.out.println(columnNames);

    raceListConSorts.add(0,columnNames);
    System.out.println(raceListConSorts);}}
--------------------------------------------------

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

[Java] 31 ArrayListの結合

前回の続きです。

raceIDからレースデータを取得し、レース結果のリストと結合させました。

ArrayList<String>同士であればaddAll、ArrayList<String>に要素を追加する場合はaddを用います。

次の第4メソッドでは得られたリストをCSVファイルにします。

<importは省略>

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

    public static void main(String args[]) {
        String ID = IDSearch();
        ArrayList<ArrayList<String>> raceList = raceSearch(ID);
        ArrayList<ArrayList<String>> raceListCon = raceSearch2(raceList);
        toCSV(raceListCon);}

    <第1メソッド、第2メソッドは省略>
    
    // 第3メソッド
    public static ArrayList<ArrayList<String>> raceSearch2(ArrayList<ArrayList<String>> raceList) {
        System.out.println("第3メソッド内出力 " + raceList);

        ArrayList<String> raceIDList = new ArrayList<String>();

        for (int i = 0;i < raceList.size();i++){
            ArrayList<String> raceListChild = raceList.get(i);
            String raceID = raceListChild.get(12);
            raceIDList.add(raceID);}

        System.out.println(raceIDList);

        ArrayList<ArrayList<String>> raceList2 = new ArrayList<ArrayList<String>>();
        List<String> columnNameList = new ArrayList<String>();
        Integer count = 1;

        for (String raceID :raceIDList){
            String table = raceID.substring(1,7);
            try (Connection conn = DriverManager.getConnection(url, user, password)){

                String sql = String.format("SELECT 日付,開催,レース,レース名,コース,天候,馬場状態 FROM horse_race_name.race_n_%s WHERE raceID = '%s'",table,raceID);

                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();

                int i = 1;
                if (count == 1){
                    while(i <= columnCount) {
                        columnNameList.add(rsmd.getColumnName(i++));}}
                count = count + 1;

                while (rs.next()) {
                    ArrayList<String> raceResultList = new ArrayList<String>();

                    int i2 = 1;
                    while(i2 <= columnCount) {
                        raceResultList.add(rs.getString(i2++));}
                    System.out.println(raceResultList);

                    raceList2.add(raceResultList);}}

            catch (Exception e) {
                e.printStackTrace();}}

        System.out.println(columnNameList);
        System.out.println(raceList2);

        ArrayList<ArrayList<String>> raceListCon = new ArrayList<ArrayList<String>>();

        for (int i = 0;i < raceList.size();i++){
            ArrayList<String> raceListChild = raceList.get(i);
            ArrayList<String> raceListChild2 = raceList2.get(i);

            System.out.println(raceListChild);
            System.out.println(raceListChild2);

            raceListChild2.addAll(raceListChild);
            System.out.println(raceListChild2);

            raceListCon.add(raceListChild2);}

        System.out.println(raceListCon);

        return raceListCon;}

    // 第4メソッド
    public static void toCSV(ArrayList<ArrayList<String>> raceListCon) {
        System.out.println("第4メソッド内出力 " + raceListCon);}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
シャフリヤール

<中略>

第4メソッド内出力 [[2020-10-25, 4回京都6日目, 5 R, 2歳新馬, 芝右 外1800m, 天候 : 晴, 芝 : 良, 1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605], [2021-02-14, 1回東京6日目, 11 R, 第55回共同通信杯(G3), 芝左1800m, 天候 : 晴, 芝 : 良, 3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611], [2021-03-27, 2回阪神1日目, 11 R, 第68回毎日杯(G3), 芝右 外1800m, 天候 : 晴, 芝 : 良, 1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]






[Java] 30 ネストしたArrayListの型指定

前回の続きです。

前のコードでは入れ子になっているArrayListの型指定をStringにしたため、その後リストとしての処理ができませんでした。

StringをArrayList<String>に修正し、変数を引き継いだ第3メソッドでも要素抽出などの処理ができるようにしました。

自分的にはネストしたリストは多用しているためArrayList<ArrayList<String>>といった少しややこしい型指定を今後も使うつもりですが、ネットではギーク向け英語サイトにしか情報がありませんでした。推奨していない、不具合を起こしやすいなど何かあるのでしょうか。

<importは省略>

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

    public static void main(String args[]) {
        String ID = IDSearch();
        ArrayList<ArrayList<String>> raceList = raceSearch(ID);
        raceSearch2(raceList);}

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

    <中略>

    // 第3メソッド
    public static void raceSearch2(ArrayList<ArrayList<String>> raceList) {
        System.out.println("第3メソッド内出力 " + raceList);

        ArrayList<String> raceIDList = new ArrayList<String>();

        for (int i = 0;i < raceList.size();i++){
            ArrayList<String> raceListChild = raceList.get(i);
            String raceID = raceListChild.get(12);
            raceIDList.add(raceID);}

        System.out.println(raceIDList);}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
シャフリヤール

<中略>

第3メソッド内出力 [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605], [3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611], [1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]
[r202008040605, r202105010611, r202109020111]

[Java] 29 戻り値がリストのメソッド

前回の続きです。

第2メソッドはリストを戻り値にして第3メソッドに渡しました。第3メソッドでも新たにリストを作成しますが、JavaではPythonのように戻り値を複数にできないので第3メソッド内で結合させるつもりです。

また変数名をJavaのルールに従って単語を直接連結かつ先頭語以外は大文字で始まるようにしました。Pythonでは全て小文字かつアンダーバー(アンダースコア)で連結します。

<importは省略>

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

    public static void main(String args[]) {
        String ID = IDSearch();
        List<String> raceList = raceSearch(ID);
        raceSearch2(raceList);}

      <第1メソッドは省略>
    
    // 第2メソッド
    public static List<String> raceSearch(String ID) {
        System.out.println("第2メソッド内出力 " + ID);

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

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

        ArrayList<String> raceList = new ArrayList<String>();
        List<String> columnList = new ArrayList<String>();
        List<String> columnNameList = new ArrayList<String>();
        int count = 1; // カラム名取得用

        for (int i = startYear; i < 2022; i++){
            System.out.println("検索年 " + i);
            try (Connection conn = DriverManager.getConnection(url, user, password)){

                String sql = String.format("SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.race_r_%d WHERE horseID = %s",i,ID);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();

                int i2 = 1;
                if (count == 1){
                    while(i2 <= columnCount) {
                        columnNameList.add(rsmd.getColumnName(i2++));}}
                count = count + 1;

                while (rs.next()) {
                    ArrayList<String> raceResultList = new ArrayList<>(columnCount);

                    int i3 = 1;
                    while(i3 <= columnCount) {
                        raceResultList.add(rs.getString(i3++));}
                    System.out.println(raceResultList);

                    raceList.add("[" + raceResultList + "]");}}

            catch (Exception e) {
                e.printStackTrace();}}

        System.out.println(columnNameList);
        System.out.println(raceList);
        
     // カラム名のリストを先頭に結合
        raceList.add(0,"[" + columnNameList + "]");
        System.out.println(raceList);

        System.out.println("出走数 " + (raceList.size()-1));

        return raceList;}

    // 第3メソッド
    public static void raceSearch2(List<String> raceList) {
        System.out.println("第3メソッド内出力 " + raceList);}}
--------------------------------------------------

出力
--------------------------------------------------
該当馬のIDは201805165です
mainメソッド出力 201805165
第2メソッド内出力 201805165
最速デビュー年 2020
検索年 2020
[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]
検索年 2021
[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]
[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]
[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]
[[[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
[[[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]], [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
出走数 3
第3メソッド内出力 [[[着順, 枠番, 馬番, 斤量, 騎手, タイム, 通過, 上り, 単勝, 人気, 馬体重, 賞金, raceID]], [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]

[Java] 28 mySQL検索結果のメタデータ取得

前回の続きです。

PythonではmySQLの検索結果を自動的にリストとして取得できますが、Javaではメタデータを取得しその情報を元にリストを作成するのが便利です。

ここまでくるとブログ情報はほとんど見当たらず、業務系の領域に入っているようです。趣味でmySQLをJavaで操作する好事家は僅少みたいです。

package mysql_test6;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

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

    public static void main(String args[]) {
        String ID = ID_search();
        System.out.println("mainメソッド出力 " + ID);
        race_search(ID);}

      <第1メソッドは省略>

    // 第2メソッド
    public static void race_search(String ID) {
        System.out.println("メソッド内出力 " + ID);

        String birth_year = ID.substring(0,4);
        Integer birth_year_int = Integer.parseInt(birth_year);
        Integer start_year = birth_year_int + 2;
        String start_year_str = start_year.toString();

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

        List<String> raceList = new ArrayList<String>();
        
        for (int i = start_year; i < 2022; i++){
            System.out.println("検索年 " + i);
            try (Connection conn = DriverManager.getConnection(url, user, password)){

                String sql = String.format("SELECT 着順,枠番,馬番,斤量,騎手,タイム,通過,上り,単勝,人気,馬体重,賞金,raceID FROM horse_race_result.race_r_%d WHERE horseID = %s",i,ID);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();

                while (rs.next()) {
                    ArrayList<String> raceResultList = new ArrayList<>(columnCount);
                    int i2 = 1;
                    while(i2 <= columnCount) {
                        raceResultList.add(rs.getString(i2++));}
                    System.out.println(raceResultList);

                    raceList.add("[" + raceResultList + "]");}}

            catch (Exception e) {
                e.printStackTrace();}}

        System.out.println(raceList);
        System.out.println("出走数 " + raceList.size());
        System.out.println("デビュー戦 " + raceList.get(0));}}
--------------------------------------------------

出力(ダービーのデータはまだ入っていません)
--------------------------------------------------
競走馬名を入力してください
シャフリヤール
競走馬名は「シャフリヤール」です
201805165
[201805165]
該当馬のIDは201805165です
mainメソッド出力 201805165
メソッド内出力 201805165
最速デビュー年 2020
検索年 2020
[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]
検索年 2021
[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]
[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]
[[[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]], [[3, 8, 11, 56.0, 福永祐一, 1:48.0, 7-8-8, 33.4, 4.9, 2, 448(-2), 956.1, r202105010611]], [[1, 6, 6, 56.0, 川田将雅, 1:43.9, 4-4, 34.1, 2.9, 2, 448(0), 3,833.6, r202109020111]]]
出走数 3
デビュー戦 [[1, 7, 13, 55.0, 福永祐一, 1:49.9, 6-4, 34.6, 2.3, 1, 450(0), 700.0, r202008040605]]

[Java] 27 コードの分割と戻り値

前回の続きです。

mainメソッドが各メソッドを順次実行する構成とし、変数を引き継いでいくようにしました。細かいところでハマりそうになりながらも、何とか書けました。

Pythonで書くときはコードが長くなると分割してライブラリにしそれぞれimportしていましたが、mainメソッドに各メソッドをぶら下げるやり方も便利ですね。Pythonでも長いベタ書きになりそうなときはこの方法も選択肢に入れようと思います。

ところで、おまじない扱いしていたvoidが戻り値なしという意味だということをようやく知りました。今まで何が空っぽなんだろうとぼんやり考えていました。

package mysql_test5;

import java.util.ArrayList;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AppTest {
    public static void main(String args[]) {
        String ID = ID_search();
        System.out.println("mainメソッド出力 " + ID);
        race_search(ID);}

    // 第1メソッド
    public static String ID_search() {
        String url = "jdbc:mysql://localhost:3306";
        String user = "ユーザ名";
        String password = "パスワード";

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("競走馬名を入力してください");

        String name = null;
        try {
            name = br.readLine();}

        catch (IOException e) {
            e.printStackTrace();}

        System.out.println("競走馬名は「" + name + "」です");

        List<String> ID_list = new ArrayList<String>();
        for (int i = 1986; i < 2019; i++){
            try (Connection conn = DriverManager.getConnection(url, user, password)){
                String sql = String.format("SELECT horseID FROM horse_list.horse%d WHERE 検索馬名 = '%S'",i,name);
                PreparedStatement ps = conn.prepareStatement(sql);
                ResultSet rs = ps.executeQuery();

                String ID = null;
                while (rs.next()) {
                    ID = rs.getString("horseID");
                    System.out.println(ID);
                    ID_list.add(ID);
                    System.out.println(ID_list);}}

            catch (Exception e) {
                    e.printStackTrace();}}

        if (ID_list.size() >= 2){
            System.out.println("該当する馬が複数います。番号を入力してください。");
            int i = 1;
            for (String s : ID_list) {
                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 num_int = Integer.parseInt(num);
            String ID = ID_list.get(num_int - 1);
            System.out.println("該当馬のIDは" + ID + "です");

            return ID;}

        else if (ID_list.size() == 0){
            System.out.println("該当する馬はいません");
            String ID = null;
            System.exit(0);

            return ID;}

        else {
            String ID = ID_list.get(0);
            System.out.println("該当馬のIDは" + ID + "です");

            return ID;}}}
    
    // 第2メソッド
    public static void race_search(String ID) {
        System.out.println("メソッド内出力 " + ID);}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
ヒシマサル
競走馬名は「ヒシマサル」です
198908574
[198908574]
201405934
[198908574, 201405934]
該当する馬が複数います。番号を入力してください。
1 198908574
2 201405934
2
該当馬のIDは201405934です
mainメソッド出力 201405934
メソッド内出力 201405934

[Java] 26 if文,リスト内要素数,文字列の整数への変換

前回の続きです。

検索結果が複数の場合、番号を入力して該当馬を選択するコードです。

書いていてさほど違和感はありませんでした。

<前回の続き>

// IDリストの要素数による条件式
if (ID_list.size() >= 2){
    System.out.println("該当する馬が複数います。番号を入力してください。");

    int i = 1;
    for (String s : ID_list) {
        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 num_int = Integer.parseInt(num);
     // リスト内要素の取得
        String ID = ID_list.get(num_int - 1);
        System.out.println("該当馬のIDは" + ID + "です");}

else if (ID_list.size() == 0){
    System.out.println("該当する馬はいません");
    // システム終了
    System.exit(0);}

else {
    String ID = ID_list.get(0);
    System.out.println("該当馬のIDは" + ID + "です");}}}
--------------------------------------------------

出力
--------------------------------------------------
競走馬名を入力してください
ヒシマサル
競走馬名は「ヒシマサル」です
198908574
[198908574]
201405934
[198908574, 201405934]
該当する馬が複数います。番号を入力してください。
1 198908574
2 201405934
2
該当馬のIDは201405934です