Java 練習問題集 ~基本レベル1の問題~

練習問題集(Training)

Javaコードの練習をします。ちょっとしたヒントもあるので頑張って解いてみてください。

Javaの文法を覚えたけど、以下のような思いがあるときに使ってください。

  • 本文の記載内容がわからない
  • まだしっくりこない
  • 基本をもっと理解したい
  • JUnitを理解したい

JUnitのセットアップ方法はこのリンクにあります。
下の方だったと思います。

注意書き

  • この問題はすべてJUnitを使用して実装します。
  • 各問題は「lvXXTraing()」というメソッドで実装します
  • 別のやり方で「LvXXTraing」というクラスを作り、メインメソッドに実装してもよいです
    public class LvXXTraing {
    public static void main(String[] args) {
        // 問題の回答
    }
    }
  • 各パッケージの関連は以下のように定義します。
  • テストケースの作成も練習します。

jp.zenryoku.practice.train: 練習問題集の問題の回答クラス
jp.zenryoku.practice.train.cls: 練習問題集のテスト対象クラス

問題一覧

基本レベル1の問題

  • LV1:System.out.printlnの応用1
  • LV2:System.out.printlnの応用2
  • LV3:変数の使い方1
  • LV4:変数の使い方2
  • LV5:標準入力を受ける
  • LV6:数字と数字以外の標準出力
    • 「正規表現」に関して
  • LV7:数字の最も下の桁
  • LV8:数値のパーセンテージ
  • LV9:商と剰余を表示
  • LV10:商と剰余を表示2
  • LV11:キャストする
  • LV12:条件分岐1
  • LV13:条件分岐2
  • LV14:条件分岐3
  • LV15:条件演算子(三項演算子)
  • LV16:配列1
  • LV17:配列2 点数の平均を出す
  • LV18:ファイルの読み込み
  • LV19:読み込んだファイルをArrayListに設定
  • LV20:読み込んだファイルをLinkedListに設定
  • LV21:プロパティファイルを読み込む

基本レベル1

LV1:System.out.printlnの応用1

コンソール表示するときには、System.out.println()の引数に値を渡すだけで表示していました。
しかし、他にも表示するときの方法があるので練習がてらに紹介します。

<問題>
System.out.printf()を使用してint型の変数numの値を標準出力に表示してください。
例:
数字の値は3です。

<System.out.printlnで実行するとき>

System.out.println("数字の値は" + num + "です。");

<ヒント>
System.out.printf()というメソッドはSystemクラスにある「out」というフィールド変数のメソッドです。
このことはJavaDocを見ればすぐわかります。
修飾子が「public」かつ「static」なので下のようなコードでアクセスできます。

System.out;

そしてこの「out」のデータ型はPrintStreamクラスです。

今回使用するメソッドのJavaDocに答えが書いてあります。

LV2:System.out.printlnの応用2

<問題>
下のようなプログラムの実行結果を1行のコードで実装してください。
※「セミコロン(;)」をつけたときは必ず改行します。
 つまり下のような書き方で実行してくださいという意味です。

System.out.println( ... );

<実行プログラム>

System.out.println("************");
System.out.println("* Welcome! *");
System.out.println("************");

LV3:変数の使い方1

<問題>
以下のコードを作成してください。

  • int型の変数「num」を宣言してください。
  • String型の変数「moji」を"test"で初期化してください。

最後に上記で作成した変数をすべて下のように一行のコードで表示してください。
※LV2と同じように1行出力してください。

LV4:変数の使い方2

<問題>
クラス「Training1」クラスを作成しTraining1型の変数を宣言してください。
そして、Training1型のクラスオブジェクトを取得して、その名前をコンソールに表示してください。

<ヒント>
Training1クラスは自作してください。
作成するクラスは以下のパッケージにjp.zenryoku.practice.train.cls配置してください。
そして、すべてのクラスはObjectクラスを親に持っています。
つまり、Objectクラスに定義しているメソッドが使用できるということです。
今回使用するメソッドはtoString()です。
同様に、クラスオブジェクトを取得するメソッドもあります。それは上のJavaDocから探してください。

LV5:標準入力を受ける

標準入力は普段パソコンを使用するときにキーボードを使用して文字列を入力すると思いますが、
その「入力」が標準入力になります。

ここで使用する標準入力はScannerクラスを使用します。
java.util.Scannerを使用するのが新しいやり方のようです。

<ヒント>
ちなみに、古いほうの標準入力の受け取りは
Systemクラスにある標準入力(System.in)をそのまま使用します。
下のようなコードです。

// 標準入力の読み取り
int in;
System.out.println("終了するときはbを入力して下さい");
while ((in = System.in.read()) != -1) {
  System.out.write(in);
  if ('b' == in) {
    break;
  }
}

LV6:数字と数字以外の標準出力

<問題>
LV5で作成したような標準入力の受け付けを行い入力した数値を表示してください。
ただし、数字以外が入力された場合は「数字を入力してください」と表示してください。
そして、入力できる桁数は5文字までに制限して、5文字を超える場合は「5文字以内にしてください」と標準出力に表示してください。

<ヒント>
Stringクラスに「matches」というメソッドがあります。

==「正規表現」に関して==
正規表現を使用してアルファベットの「a~zまで」とか数字の「0~9」までとか指定することができます。
数字の場合は「数値」ではないので0が???個のように考えます。
正規表現の例:
[a-z]:「a~z」までの小文字のアルファベット(1文字分)
[0-9]:「0~9」までの数字(1文字分)

[a-z]{2,4}:a~zまでの文字を2回以上、4回以下繰り返すことを示す

<サンプルコード(JUnit使用)>

public class StringTest {
    @Test
    public void test01() {
        String val = "123456";
        if (val.matches("[0-9]{4,}")) {
            System.out.println("Hello!");
        } else {
            fail();
        }
    }
}

<実行結果>

書式文字列に関してはこちらのドキュメントが参考になります。

LV7:数字の最も下の桁

<問題>
整数を入力し、その整数の下1桁目の数字を表示して下さい。
例:表示結果は下のように出力してください。

整数を入力してください
123450
最も下の桁は0です

LV8:数値のパーセンテージ

下の例のように、入力値Aが入力値Bの何%か表示してください。
※出力結果は整数で表示してください。⇒小数点以下は表示しない

<ヒント>
今まで使用していた「int型」は整数を格納する変数です。
パーセンテージは小数点を含むので「int型」は使用できません。
double型を使用します。

例:表示結果

2つの整数を入力してください
12
入力値A:12
24
入力値B:24
Aの値は、Bの50%です

LV9:商と剰余を表示

LV8と同様に2つの整数を読み込み、商と剰余を表示してください。
<ヒント>
商:割り算の結果
剰余:割り算後の余り

例:表示結果

2つの整数を入力してください
11
入力値A:11
5
入力値B:5
AとBの商は2.2です
AとBの剰余は1.0です

LV10:商と剰余を表示2

LV9と同様に出力するのですが、今度は下のように出力してください。
※System.out.printfを使用して、フォーマット文字列には「%f」を使用してください。

例:表示結果

2つの整数を入力してください
4
入力値A:4
3
入力値B:3
AとBの商は1.333333、剰余は1.000000です。

LV11:キャストする

<問題>
下の例のように、入力値Aが入力値Bの何%か表示してください。
ただし、表示するときは以下の2パターンの表示を行ってください。

  1. 出力結果は整数で表示してください。⇒小数点以下は表示しない
  2. 出力結果は小数で表示してください。⇒小数点以下は表示する

<ヒント>
「キャスト」というのはデータ型の変換を意味します。
この問題では「int型~double型へのキャストを使用します」

LV12:条件分岐1

<問題>
標準入力を受け取り、入力した文字列に数字が含まれている場合
標準出力に「Has Number!」を出力
そうでない場合は「No Number!」を出力してください。

例:表示結果

入力してください
uiioi1
入力値:uiioi1
Has Number!

<ヒント>
正規表現が使えます。

LV13:条件分岐2

<問題>
標準入力を受け取り、入力した文字列に「a」が含まれている
もしくは、「z」が含まれている場合に「Hello AZ!」と標準出力に表示する
それ以外は「Hello World!」と表示してください。

<ヒント>
String#contains()が使用できます。
※上の書き方はStringクラスのcontainsメソッドという意味です。

そして、JavaDocにある「CharSequence」はStringクラスに実装(implements)されているので
Stringを渡すこともできます。まとめると以下のクラスを渡すことができます。

  1. CharBuffer
  2. Segment
  3. String
  4. StringBuffer
  5. StringBuilder

LV14:条件分岐3

<問題>
標準入力を受け取り、入力した文字列に「a」が含まれている
かつ、「z」が含まれている場合に「Hello AZ!」と標準出力に表示する
それ以外は「Hello World!」と表示してください。

ヒントはありません。。。

LV15:条件演算子(三項演算子)

<問題>
標準入力を受け取り、入力した文字列に「a」が含まれている場合
標準出力に「Hello A!」と表示
それ以外は「Hello World!」と表示してください。
ただし、作成するコードは4行以内で書いてください。

例:表示結果

入力値:おおお
Hello World!

<ヒント>
条件演算子(三項演算子)の書き方

データ型 変数名 = 条件式 ? TRUEの場合 : FALSEの場合;

LV16:配列1

<問題>
配列長3のint型配列「hako」を宣言して、配列の中に以下の値を設定し
2番目の値を標準出力に表示してください。

<ヒント>

String[] mojimoji = new String[7]; // String型の配列を初期化
mojimoji[0] = "a";
mojimoji[1] = "b";
mojimoji[2] = "c";
mojimoji[3] = "d";
mojimoji[4] = "e";
mojimoji[5] = "f";
mojimoji[6] = "g";
System.out.println("配列の2番目:" + mojimoji[2]);

LV17:配列2 点数の平均を出す

<問題>
A塾には生徒が5人います。この生徒たちのテストの平均を出すために
プログラムをループ文を使用して作ってください。

仕様は以下の通りです。

  1. 生徒はA君、B君、C君、D君、E君の5人
  2. 点数は標準入力から入力
  3. 「平均点はXXXです」と標準出力に表示

例:表示結果

A君: 10点
B君: 20点
C君: 30点
D君: 40点
E君: 50点
平均点数は:30点

LV18:ファイルの読み込み

<問題>
「Wepons.csv」ファイルから文字列を読み込み中身を標準出力に表示してください。
※読み込むファイルは/src/main/java/resources以下に配置してください。

<ヒント>

LV19:読み込んだファイルをArrayListに設定

<問題>
LV18で読み込んだファイルのデータをjava.util.ArrayListにセット、データの3行目を標準出力に表示してください。

例:表示結果

CSVののデータ数は20
カテゴリID: 3
名前: たけやり
カテゴリLV: 1
値段: 10
攻撃力: 3
効果: -
両手FLG: TRUE
射程: 1
リロード: -
説明: たけでできた、やり

LV20:読み込んだファイルをLinkedListに設定

<問題>
LV18で読み込んだファイルのデータをjava.util.LinkedListにセット、データの3行目を標準出力に表示してください。

例:表示結果

CSVののデータ数は20
カテゴリID: 3
名前: たけやり
カテゴリLV: 1
値段: 10
攻撃力: 3
効果: -
両手FLG: TRUE
射程: 1
リロード: -
説明: たけでできた、やり

LV21:プロパティファイルを読み込む

LV18と同じ、/src/main/java/resources以下に「test.properties」を配置してこのファイルの中身を標準出力に表示してください。

例:表示結果

KEY: macVALUE: "マッキントッシュ"
KEY: winVALUE: "ウィンドウズ"
KEY: adsVALUE: "グーグルアドセンス"

<ヒント>
java.util.Properties#load())を使用してください。

LV22:メソッドの処理結果を確認する1

前提として、問題のメソッドは「lv22Traing()」に書きます。

それ以外に、「test01()」 メソッドを作成してください。引数なし、返り値はint型です。

test01()の処理内容は、自分で考えてみてください。

<問題>
test01の処理結果が「10」になることを確認するテストケースを作成して、テスト結果がOKになるようにしてください。

LV23:メソッドの処理結果を確認する2

前提として、問題のメソッドは「lv23Traing()」に書きます。

それ以外に、「test02()」 メソッドを作成してください。引数なし、返り値はString型です。

<問題>
test02の処理結果が「"aaa"」になることを確認するテストケースを作成して、テスト結果がOKになるようにしてください。

LV24:メソッドの処理結果を確認する3

前提として、問題のメソッドは「lv24Traing()」に書きます。

それ以外に、「test03()」 メソッドを作成してください。引数int型、返り値はString型です。

<問題>
test01の処理結果が「"a1b"」になることを確認するテストケースを作成して、テスト結果がOKになるようにしてください。

関連ページ一覧

Eclipse セットアップ(Mac版)

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. オブジェクト指向の概念1〜OracleDocのチュートリアル1〜
  2. オブジェクト指向の概念2〜クラスとは〜

Java ワンポイント ~コンソールをリフレッシュする~

イントロダクション

テキストRPGを作成中です。
コンソールのみで展開する仕様なので、コンソールのれふれっふ処理が必要になりました。

調べたので、アップしておきます。

Javaからコマンドを実行する

具体的には、コンソール画面(コマンドプロンプト(Win)やターミナル(Mac))でのコマンド実行をJavaプログラムから実行するということになります。

こちらのサイトを参考にすると、実行方法としては以下のようにコードを書きます。

Rumtime.getRuntime().exec(コマンド);

しかし、下のようなエラーが出ました。

java.io.IOException: Cannot run program "cls": CreateProcess error=2, 指定されたファイルが見つかりません。
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:621)
at java.lang.Runtime.exec(Runtime.java:451)
at java.lang.Runtime.exec(Runtime.java:348)
at jp.zenryoku.rpg.util.ConsoleUtils.clearConsole(ConsoleUtils.java:172)
at jp.zenryoku.rpg.TextRpgLogic.updateData(TextRpgLogic.java:115)
at jp.zenryoku.rpg.TextRpgGameEngine.start(TextRpgGameEngine.java:40)
at jp.zenryoku.rpg.GameMain.main(GameMain.java:16)
Caused by: java.io.IOException: CreateProcess error=2, 指定されたファイルが見つかりません。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init(ProcessImpl.java:444)at java.lang.ProcessImpl.start(ProcessImpl.java:139)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 7 more

EclipseからMainメソッドを起動した場合でした。

Fix

調べてみると下のようなコードでコンソールをクリアdできるようだ。

new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();

ただし、Eclipseではちゃんとクリアできないが、JARファイルから起動したときはちゃんとクリアされた。

関連ページ一覧

EclipseセットアップWindows版

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜

JUnitの使い方~テストクラスの作成と実行~


JUnitの設定を行う。

EclipseでJUnitの設定を行います。

  1. プロジェクトを右クリック
  2. ビルドパスを選択する
  3. ライブラリの追加を選択
  4. JUnitを選択

テストするためのクラスを作成する。

今回は、サンプルなので簡単なものです。
ずばり、下のようなクラスを作成しました。

package jp.zenryoku.sample;

/**
 * JUnitの作成から実行までのサンプルクラス
 * @author 作成者の名前
 *
 */
public class JUnitSample {
    /** 定数 */
    private static final String TITLE = "JUnitサンプル";
    /** フィールド変数 */
    private int age;

    public JUnitSample() {
        // 年齢を設定する
        age = 10; // とりあえずは10歳にする
    }

    /**
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * @param age セットする age
     */
    public void setAge(int age) {
        this.age = age;
    }

}
  • 定数として「TITLE」を定義
  • フィールド変数に年齢を定義
  • コンストラクタで年齢を10に設定
  • メソッドとして年齢のGetterSetterを作成

JUnitテストクラスを作成

テストクラスを作成するときは、(自分の常識内では)以下のように作成します。

  1. パッケージ名はテスト対象クラスと同じ
  2. テスト対象クラス+Testという名前にする

テストクラスを作成するときには、テスト対象クラスを定数として保持してしまうと楽なのでそのようにしています。状況によりstatic(静的)でやるべきか、そうしないべきかの判断は、使用したいアノテーションで判断するとよいと思います。

例:
1.テストクラスを起動するときに一度だけ起動するのを「@BeforeClass」アノテーションを使用するならば、static修飾子をつける必要がある。
2.テストケースの実行時に必ずコンストラクタを起動するのであれば、「@Before」を使用するとよい

\@Beforeを使用する場合

上に作成したテストケースを修正して、「@BeforeClass」アノテーションを使用しないパターンで実装してみます。

ここでコンストラクタに引数を追加したものを追加します。具体的には下のようなコードになります。

public JUnitSample(int age) {
    this.age = age;
}

そして、実行するテストに関しては、下のようになります。

package jp.zenryoku.sample;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * JUnitテストクラス: パッケージ名が同じなのでインポートしなくてよい
 * @author 作成者の名前
 */
public class JUnitSampleTest {
    /** テスト対象クラス(テスト実行時には必ず1つなのでstaticでよい) */
    private JUnitSample target;

    /**
     * このテストクラスをインスタンス化するときの処理。
     * このメソッドは1度だけ動く
     */
    @BeforeClass
    public static void initClass() {
        // テスト対象クラスをインスタンス化
//      target = new JUnitSample();
    }

    /**
     * controll + spaceでインポートできる。
     * テストを実行する前の準備処理、テストケースが動くたびに動く
     */
    @Before
    public void initTest() {
//      // 15歳に設定しなおす。
//      target.setAge(15);
        target = new JUnitSample(12);
    }

    /**
     * テストケース1:年齢(age)が15歳に設定されているか確認する。
     */
    @Test
    public void test01() {
        // 警告が出るのでstaticインポートに変更する。
        assertEquals(12, target.getAge());
    }
}

そして、コンストラクタ以外でも年齢の設定を変更できることを確認するテストケースを追加します。

/**
 * テストケース2:年齢を5歳に設定しなおしたときのテスト
 */
@Test
public void test02() {
    target.setAge(5);
    assertEquals(5, target.getAge());
}

テスト作成の方法

関連ページ一覧

Eclipseセットアップ(Windows版)

Eclipse セットアップ(MAC版)

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java ミニゲーム ソース付き 〜テスト駆動開発:文言出力部品を作る〜

今回は、RPGゲームでよくある文字を1文字ずつ読めるスピードで出力する部品を作ります。

今まで作成したテキストRPGゲームに追加します。
現状は、こんな感じで動きます。

文字の出力は、一括で出力するのでゲームっぽくありません。どちらかというとログ出力っぽいです(笑)

文字出力部品を作る

現状は、System.out.println()を使用しています。これは引数にある文字列を標準出力に出力します。
標準出力 = System.outになります。

問題

どーやって1文字ずつ出力するか?
とりあえずは、テスト駆動開発にしますので、テストケースを作成します。

毎度おなじみJUnit

JUnitを使用してテストクラスを動かします。

作成手順

  1. Eclipseのプロジェクトに「test」フォルダを作成する
  2. テストするクラスと同じパッケージを作成する
  3. テストするクラスの後にTestをつけたクラスを作成する
  4. 〜Testクラスにテストケースを作成する
具体的に。。。

実装した時の動画を作成しました。

詳細は以下のようになります。
上の手順4以降の記載になります。

JUnitをビルドパスに追加


動画にもあるのですが、上のような画面でJUnitを追加します。細かい部分は動画にありますので参照ください。

テストケースを作る

今回のテストケースはコンソールにゆっくりと表示できれば良いので、動かすだけになります。
故に、コードは下のようになります。

public class PrintUtilsTest {
    @Test
    public void testPrint01() {
        String mes = "アイウエオカキクケコ。。。。";
        try {
            PrintUtils.print(mes);
        } catch (InterruptedException e) {
            fail(e.getMessage());
        }
    }
}

今回の作成するクラスは、PrintUtilsクラスです。テストクラスは上のコードにある通りです。

作成するクラスをガワだけ作ったら、あとは、テストケースで呼び出してやる処理を実装してやるだけです。

あとは、実装→起動→修正→確認を繰り返して終了です。

シンプルなもんです(笑)

JUnitを使用したときの再生リストへのリンクです。

JUnitで10進数を2進数に変換する処理を実装

テストファーストで、補数算出メソッドの実装

EclipseでJUnitの起動設定~テストクラスの作成1

EclipseでJUnitの起動設定~テストクラスの作成2

Java テスト駆動で引き算のメソッドを作る

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java ミニゲーム ソース 〜じゃんけんゲーム in Console 完成〜

コンソール版のじゃんけんゲームを作成しました。
しかし、とりあえず動く状況なので。。。

これに、細かい部分を作ってしまおうと思います。
まずは、バグ退治です。。。がしかしその前に処理の概要をいかに記載します。

  1. プログラムを起動する(Mainクラスのメインメソッド)
  2. コマンドで「exe」を入力してエンターキー押下
  3. じゃんけんゲームの起動(FirstCls#execute())
  4. じゃんけんゲームの入力を待つ
  5. 「1〜3」の入力かチェック
  6. 乱数を生成し CPUの手とする
  7. 両者の勝敗判定を行う

そして、修正した結果(差分)はこちらのリンクで確認できます。

バグのないようですが、じゃんけんゲームの入力時に「1〜3以外の値」が入力された時にMapから値が取得できず。。。
playerの手がnullになります。そして、処理は次へ行ってしまうので、「???」となります。

具体的なコードは下の部分です。
メインメソッドは下の部分で、FirstCls#handleInput()を呼び出しています。
Mainクラス

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input = scan.next();

        FirstCls first = new FirstCls();
        if ("exe".equals(input)) {
            first.execute(scan);
        }
        boolean isNumber = first.isNumberString(input);
        if (isNumber) {
            System.out.println(input + "は数字です。");
        } else {
            System.out.println(input + "は数字ではありません。");
        }
    }
}

FirstCls#execute()でじゃんけんゲームが開始されます。

FirstClsクラス

public void handleInput(String input) {
    System.out.println("入力値: " + input);
    if (isNumberString(input)) {
        System.out.println(input + "は、数字です");
    } else {
        System.out.println(input + "は、数字ではありません");
    }
}

クラス名がリンクになっていますが、これはGithubへのリンクになります。

修正する(修正内容)

修正方法としては、チェック処理を入れてやります。
そして「クラスの使い方」という観点から、チェッククラスを作成します。

余計な音が履いていますが、これを作成した時の動画です。

ここで追加した実装はCheckUtilクラスです。
このクラスは、実装の過程で、メソッドが増えていきましたが、まぁそんなもんでしょう。

ちなみに、このクラスのメソッドは、全て「静的メソッド」と呼ばれるメソッドです。
呼び出す時にクラス名.メソッド名という形で、呼び出します。

チェック処理

このチェック処理のポイントはズバリ「正規表現」です。
使用している以下の正規表現は0〜9の文字にマッチするのであればTRUEを変えす(そうでなければFALSEを返す)メソッドを使用しています。
そして、同じ名前のメソッドがあります。並べてみると違いが一目瞭然です。

public static boolean isNumber(String numberStr) {};
public static boolean isNumber(String numberStr, String range) {};

そして、Stringクラスにあるメソッドを使用しています。この引数に渡す文字列が「正規表現」であり、このメソッドの返り値が判定結果になります。

numberStr.matches(range)

オーバーロード

上のような実装のことを「メソッドのオーバーロード」と言います。親クラスのメソッドを上書きする「オーバーライド」とこんがらないように気をつけてください。

処理の内容に関してですが
・引数が1つのメソッドは単純に「数字の入力かチェック」
・引数が2つのメソッドは、数字の範囲を指定してチェック」
というように、処理の内容が若干違います。

初めに「0-9の入力(数値入力)チェック」を作成したのですが、じゃんけんで使用するのは1〜3までだけではないか。。。と気がついたので、数字入力チェックに「範囲」を追加しました。

public class CheckUtil {
    /** 0-9(数字)判定をする時の正規表現 */
    public static final String REGREX = "[0-9]";

    /** 1-3までの判定に使用する正規表現 */
    public static final String REG_1_TO_3 = "[1-3]";

    /**
     * 必須入力チェック、第二引数にあう正規表現でのチェックを行う
     * 
     * @param numberStr 検証する文字列
     * @param range 判定用の正規表現
     * @return true: 正規表現にマッチ false: マッチしない
     */
    public static boolean isNumber(String numberStr, String range) {
        // 正規表現で判定します。数字のrangeに当てはまる時にtrue
        if (isEmpty(numberStr) && numberStr.length() != 1) {
            return false;
        }
        if (numberStr.matches(range)) {
            return true;
        }
        return false;   }
    /**
     * 引数の1文字が数字かどうかの判定をする。。
     * 
     * @param numberStr
     * @return true: 引数が0-9 false: 0-9ではない
     */
    public static boolean isNumber(String numberStr) {
        // 正規表現で判定します。数字の0-9に当てはまる時にtrue
        if (isEmpty(numberStr) && numberStr.length() != 1) {
            return false;
        }
        if (numberStr.matches("[0-9]")) {
            return true;
        }
        return false;
    }

    /**
     * 引数に渡した文字列が、Null、またはから文字("")
     * @param str 判定する文字列
     * @return ture; 
     */
    public static boolean isEmpty(String str) {
        if (str == null || "".equals(str)) {
            return true;
        }
        return false;
    }
}

ちなみに、静的メソッドは、static修飾子をつけて実装します。インスタンスを生成しないので、メモリの節約になりますが、作りすぎると余計な負担(メモリ使用)になるので注意です。

まとめ

今までに作成したクラスFirstClsでの処理を修正しました。
くどいようですが、Mainメソッドは修正していません。

そして、追加したCheckUtilクラスはチェック担当のクラスです。

なので、このクラスにはチェック処理しか追加しません。



関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜