Java はじめて12 〜ループ処理B: while文〜

今回はwhile文をやります。今までのfor文と同じような感じですが、とてもシンプルです。whileの中の条件がFalseになると処理を抜けます。

while(条件) {
     // 処理
}

for文と比べて、初期化処理とか後処理がないので、まぁ楽です。
実際にコンソールゲームを作成するのにもwhile文を使用しています。初期化処理などが入らないので。。。

public static void main(String[] args) {
    Lv3_3_RefactorLv2 main = new Lv3_3_RefactorLv2();
    // 標準入力
    Scanner input = new Scanner(System.in);

    while(true) {
        System.out.println("コマンドを入力してください: ");
        String inStr = input.nextLine();
        CommandIF cmd = main.getCommandIF(inStr);
        if (cmd != null) {
            cmd.execute();
            continue;
        }
        if ("bye".equals(inStr)) {
            System.out.println("Good Bye");
            break;
        } else {
            System.out.println("対象のコマンドは登録されていません。: " + inStr);
        }
    }
}

これは無限ループを行なっているので、条件を指定しているのとは違うのですが。。。

public static void main(String[] args) {
   int i = 0;
   while(i < 3) {
       System.out.println("カウント: " + i);
       i++;
   }
}

これは、よくある形のwhile文です。for文と同じようなことをやっています。

問題

while文を一回使用して、コンソール出力にて下のような絵を描画してください。「*(アスタリスク)」を使って描画します。
上から順にアスタリスクが1個, 2個, 3個, 4個, 5個, 6個と並んでいます。

*
**
***
****
*****
******

でわでわ。。。



Java はじめて 11 〜ループ処理A: for文2 拡張for文〜

今回は、拡張for文の書き方をやります。書き方は以下のようになります。

for (取り出した変数 : 配列などの変数) {
    // 何かしらの処理
}

前回のfor文

前回やったfor文は昔からあるもので、色んな事に使用できます。下のような書き方です。

for (初期化 ; ループ条件 ; ループする時の処理) {
   // 何かしらの処理
}

拡張for文

一言で言えば使いやすい、なのですが、それは配列やリストをループする時の話です。使い方次第では色んなことができると思います。実際に使用できるサンプルコードを下に示します。

配列

public static void main(String[] args) {
   String[] arr = new String[]{"一郎", "二郎", "三郎"};
   for (String name : arr) {
      System.out.println("私の名前は、" + name + "です");
   }
}

こんな感じです。ちなみにリストでやる場合も同じような形です。

List

public static void main(String[] args) {
   List<String> list = new ArrayList<String>;
   list.add("一郎");
   list.add("二郎");
   list.add("三郎");
   for (String name : list) {
      System.out.println("私の名前は、" + name + "です");
   }
}

ラムダ式

public static void main(String[] args) {
   List<String> list = new ArrayList<String>;
    List list = new ArrayList<>();
    list.add("一郎");
    list.add("二郎");
    list.add("三郎");
    // ここがラムダ式
    list.forEach(System.out::println);
} 

問題

for文を一回使用して、コンソール出力にて下のような絵を描画してください。「*(アスタリスク)」を使って描画します。
上から順にアスタリスクが1個, 2個, 3個, 4個, 5個, 6個と並んでいます。

*
**
***
****
*****
******

でわでわ。。。



Java はじめて 10 〜ループ処理A: for文1〜

Javaでのループ処理の第一弾「for文」を理解します。

for文の書き方

for (初期化 ; ループ条件 ; ループする時の処理) {
   // 何かしらの処理
}

というような形で実装します。具体的には下のように書きます。これは、ループを5回繰り返し0〜4をコンソールに表示するプログラムです。

public static void main(String[] args) {
   for(int i = 0; i < 5; i++) {
      System.out.println("カウント" + i);
   }
}

このような形でfor文は作ります。for文の動きは以下のようになります。

  1. 初期化処理=int i = 0; が走る
  2. ループ条件=i < 5がtrueの時ループする
  3. 1回の処理が終わったらループする時の処理=i++を実行する
  4. ループ条件でfalseの時にループを抜ける

for文の実用例

以前やった配列を良く使用します。
配列の中身を取り出して、何かしらの処理を行いたい時がよくあります。こんな時は以下のような実装を行います。

public static void main(String[] args) {
   String[] arr = new String[] {"a", "b", "c"};
   for(int i = 0; i < arr.length; i++) {
      System.out.println(arr[i];
   }
}

フロー図を書くと下のようになります。

問題

for文を使って1〜10までの合計を計算し、結果を表示するプログラムを書いてください。
<表示結果>

1+2=3
3+3=6
6+4=10
  ・
  ・
  ・

健闘を祈ります。

でわでわ。。。



Java はじめて 9 〜switch文〜

今回は、switch文の書き方、使い方(サンプルコード)をやります。switch文はif文と同様に、文字列と数値で判定できます。
※JDK1.8では文字列が使用可能、しかし古いJDKでは使えないかも?

switch文の書き方

switch(判定する値) {
   case 値がXXXの時のケース :
           // 処理1
    case 同上:
          // 処理2
    default:
           // 上記以外のケース
}

こんな感じです。if文と何が違うのか?見た目が違いますね。。。なので、前回作成したプログラムはif文で作成しましたが、switch文で書き直すことができます。
<前回のコード>

Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
if ("aaa".equals(str)) {
   System.out.println("aaaが入力されました。");
} else {
   System.out.println("そのほかの値が入力されました。");
}

コードを書き直す前に、一回動かしてみましょう。
全体のコードは下のようになります。

import java.util.Scanner;

public class MainMethodTest {
   public static void main(String[] args) {
      System.out.println("Hello World");
      MainMethodTest main = new MainMethodTest();
      // 標準入力を受ける
      Scanner scan = new Scanner(System.in);
      String str = scan.nextLine();

      if ("aaa".equals(str)) {
         Systme.out.println("aaaが入力されました。");
      } else {
         System.out.println("その他の値が入力されました。");
      }
   }
}

これは、単純にif文で書いた時のもの。。。これを書き換えてswitch文に変更します。

   public static void main(String[] args) {
      System.out.println("Hello World");
      MainMethodTest main = new MainMethodTest();
      // 標準入力を受ける
      Scanner scan = new Scanner(System.in);
      String str = scan.nextLine();

      switch (str) {

      case "aaa":
         System.out.println("aaaが入力されました。");

      default:
         System.out.println("その他の値が入力されました。");
      }
   }

これで動かしてみます。

ん?何か余計なものが出力されています。「その他の〜」
は表示されちゃいけないはず。。。

そうなんです。「break」がないので処理がdefaultの部分も通ってしまうのです。
この「break」はループしている時にも使えるコードで、「処理を抜ける」という意味があります。ちょっと上のコードに「break」を加えて実行してみます。

   public static void main(String[] args) {
      System.out.println("Hello World");
      MainMethodTest main = new MainMethodTest();
      // 標準入力を受ける
      Scanner scan = new Scanner(System.in);
      String str = scan.nextLine();

      switch (str) {

      case "aaa":
         System.out.println("aaaが入力されました。");
         break;
      default:
         System.out.println("その他の値が入力されました。");
      }
   }

こんな感じで実装します。〜文は基本ですが、実際にアプリケーション(ゲームも含む)を作成しようとした時の土台になります。ここら辺を理解して、オブジェクトの組み合わせ方を理解してやれば、想い通りのアプリケーションができるかも?
※何かをやろうとした時に「イレギュラー」はつきものです。やはり「根性」で突破するしかないような気がします(笑)

そんなわけで、今回のswitch文はここまでにしようと思います。

関連ページ

Java Mid Basic

Java Basic

やったこと一覧



Java はじめて8 〜booleanとif~

if文は「もし〜だったら〜」のような処理を行います。条件分岐と呼ばれる処理です。
これはよく使うし、プログラムでもちょっと間違うとえらいことになってしまうので。要注意です。

Boolean変数

プリミティブ型の変数「boolean」があります。これは値として持つのが2つだけです。
「True」と「False」だけです。時によりint型の「0」をFalse, 「1」をTrueとして扱うこともあり、実際にそのように値をセットすることもできたのは昔の話のようです。。。
それでは、これを一体何に使うのか?

if文の書き方

プログラムでのif文は下のように書きます。

if (条件式) {
   // 処理
   }

実際には、このように書きます。

Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
if ("aaa".equals(str)) {
   System.out.println("aaaが入力されました。");
}

これがif文です。大したことありません(笑)
でわ、次、「もし〜だったら〜、そのほかの場合はXXXX」を加えてみます。

Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
if ("aaa".equals(str)) {
   System.out.println("aaaが入力されました。");
} else {
   System.out.println("そのほかの値が入力されました。");
}

これをelse文とかelse句と呼びます。実際は「エルスのなかにXXXX」なんて言ったりします。

まぁ手応えがあるかと思います。
でわ、次「もし〜だったら〜、他にもしXXXだったら、XXX、そのほかの場合は○○○」
のようにちょっと複雑な処理を行いたい場合

Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
if ("aaa".equals(str)) {
   System.out.println("aaaが入力されました。");
} else if ("bbb".equals(str)) {
   System.out.println("bbbが入力されました。");
} else {
   System.out.println("そのほかの値が入力されました。");
}

上のように条件を加えてやります。

あれ?

「boolean使ってなくない?」と思った方、流石でございます。変数にbooleanを取り出していないのです。
つまり「"aaa".equals(str)」の部分がbooleanを返却します。
それに関しては、JavaDocAPIを見るのが一番です。今回使用しているのは"aaa"のメソッド「equals」です。
「"aaa"は文字列では?」と思った方、流石でございます。「文字列=String」なのです。
だからStringクラスのメソッド(JavaDocへのリンク)が使用できるのです。

実践

以前作成したハローワールドの処理を変更してみます。
以前のソース

ublic class MainMethodTest {
   public static void main(String[] args) {
      System.out.println("Hello World");
      MainMethodTest main = new MainMethodTest();
      main.calculation();
   }
   /** viを使用する時「i」を入力すると文字入力ができる*/
   public void calculation() {
       System.out.println("1 + 1 = " +(1+1));
   }

}

このソースに先ほどのif文を入れてみます。

public class MainMethodTest {
   public static void main(String[] args) {
      System.out.println("Hello World");
      MainMethodTest main = new MainMethodTest();
      main.calculation();
      // if文を追加
      if (args.length == 0) {
         System.out.println("プログラム引数がありません");
      } else if (args.length >= 3) {
         System.out.println("プログラム引数は2つまでです。");
      } else {
         System.out.println("プログラム引数は1、2個あります");
      }
   }
   /** viを使用する時「i」を入力すると文字入力ができる*/
   public void calculation() {
       System.out.println("1 + 1 = " +(1+1));
   }

}

実行してみました。こんな感じで動きます。

でわでわ。。。

関連ページ

Java Basic Step1-3



Java はじめて7 〜配列とは、配列の使い方〜

今回は、配列について記載します。配列とは変数の集まりです。自分のイメージは「ダンボール」です。

配列とは

イメージ的な話をしても仕方ないのですが、目に見えないものなのでイメージを「自分なりに」明確にする必要があります。
データ型は以前示したように、int型、double型などプリミティブ型でも、参照型でも配列として扱うことができます。

//// プリミティブ型 ////
// int型の配列
int[] num = new int[] {0, 1, 2, 3];
// double型の配列
double[] dob = new double[] {1.0, 2.2, 0.1};
//// 参照型 ////
String[] strs = new String[] {"aa", "bbb", "vcv"};
OriginalClass[] cls = new OriginalClass[] {new OriginalClass(), new OriginalClass()};

Eclipseで初期化したものは下のように表示されました。と言うかビルドエラーが出ませんと言うことが言いたいだけの画像です。

何に使うの?

ズバリ、情報処理の部分で使用します。具体的にはDBから取得したデータ、WebAPIで取得したデータなど(JSONの配列になっていることが多いです)、オープンデータなどがあります。
ちょっと、ダウンロードしてみたので、それを一部記載します。ダウンロードしたのは「オープンデータ取組済自治体一覧」です。

団体コード,団体名,サイトのURL1,サイトのURL2,サイトのURL3,追加日,更新日
010006,北海道,http://www.pref.hokkaido.lg.jp/ss/jsk/opendata/opendata.htm,https://www.harp.lg.jp/opendata/,,,
020001,青森県,https://opendata.pref.aomori.lg.jp/,,,,2019.03.11
030007,岩手県,https://www.pref.iwate.jp/kensei/seisaku/jouhouka/1012070/index.html,,,,
040002,宮城県,http://www.pref.miyagi.jp/site/opendata-miyagi/,,,,
050008,秋田県,https://www.pref.akita.lg.jp/pages/archive/32419,,,,

このCSVデータというのは、「カンマ区切りの可変長データ」で行の一番初めの部分「団体コード,団体名,サイトのURL1,サイトのURL2,サイトのURL3,追加日,更新日」と記載している部分がヘッダー(見出し)にあたります。
みやすくすると以下のようになります。

団体コード 団体名 サイトのURL1 サイトのURL2 サイトのURL3 追加日 更新日
010006 北海道 http://www.pref.hokkaido.lg.jp/ss/jsk/opendata/opendata.htm,https://www.harp.lg.jp/opendata/

上記のように、みることができます。そしてプログラムではこのようなデータをCSVと呼び、カンマ区切り、タブ区切りのデータとして通信したり、オープンデータのようにダウンロードできたりします。

配列の注意点

配列はデータとして扱うことが多いので、データの出し入れをやることが(実装として)多いです。ですが、データを取り出そうとした時に1番目、2番目。。。と考えていると間違えます。下の杉風コードを見てください。
String[] lv1Array = new String[] {"a", "b", "c"};
上のコードは"a"を取得しようとするときはlv1Array [0]のように実装する必要があります。lv1Array[1]とすると"b"が取得されてしまいます。つまりは

配列は0番目から始まります。

とりあえずは「そんなもんだ」と理解しておいてください。

このようなデータを解析したり、統計学したりするのが最近の流行りのようですが、そんなことよりも早く「テキストRPG」を完成させたいという欲求が自分にはあります(笑)。
本当のことを言うと「統計学」がわからないので現状では作業がストップしている状況です。ただいま勉強中。。。

配列を使ったサンプルコード

Gitにアップしているのでこちらはダウンロードできます。そして、下のコードはGitのコードになります。

public static void main(String[] args) {
    // 1次元配列
    String[] lv1Array = new String[] {"a", "b", "c"};
    // 2次元配列
    String[][] lv2Array = new String[][] {{"a", "b", "c"}, {"d", "e", "f"}};
    // 3次元配列
    String[][][] lv3Array = new String[][][] {
        {{"a", "b", "c"}, {"d", "e", "f"}}
        ,{{"g", "h", "i"}, {"j", "k", "l"}}
        ,{{"m", "n", "o"}, {"p", "q", "r"}}
        };
    // 1次元配列を表示する
    System.out.println("*** 1次元配列を表示 ***");
    for (String nakami : lv1Array) {
        printf("", nakami);
    }
    // 2次元配列
    System.out.println("\n*** 2次元配列を表示 ***");
    for (String[] nakamiLv2 : lv2Array) {
        for (String nakami : nakamiLv2) {
            printf("", nakami);
        }
    }
    // 3次元配列
    System.out.println("\n*** 3次元配列を表示 ***");
    for (String[][] nakamiLv3 :lv3Array) {
        for (String[] nakamiLv2 : nakamiLv3) {
            for (String nakami : nakamiLv2) {
                printf("", nakami);
            }
        }
    }
}

結局は、配列と言ってもデータを1つに変数にまとめるための気候なんだと思ってもらっても結構な感じです。
そして、StringクラスなどにはtoArray()メソッドがあり、配列として扱うためのAPIが揃っているので配列を理解しておくと便利です。

追伸

上のCSVデータですが。これは初めに文字列で受け取ります。それを配列に変換してやれば、データの1つ1つを扱えます。いかにサンプルコードを示します。

String csvData = "010006,北海道,http://www.pref.hokkaido.lg.jp/ss/jsk/opendata/opendata.htm,https://www.harp.lg.jp/opendata/,,,\r\n020001,青森県,https://opendata.pref.aomori.lg.jp/,,,,2019.03.11";
String[] csv = csvData.split(",");

// 拡張for文
for (String data : csv) {
    System.out.pritln(data);
}

余談ですが

java.util.ArrayList

このクラスは、可変長配列を実装しているクラスで「リスト」と名前がついていますが、配列です。JavaDocにも記載があります。
とりあえずは、配列が使えると「データサイエンス」にも手が出るかも?と言うことです。

関連ページ

データ型の扱い

Booleanなどのデータ型

For文の書き方

while文の書き方



Java はじめて6 〜変数について2、byte, char, boolean型〜

今回はbyte型, char型とboolean型の変数について記載します。

byte

byte型は2進数を表現します。ちなみにパソコンの中身(デジタル)は2進数でできています。いま見ているブログも、スマホで遊んでいるゲームも全て「0, 1」でできています。つまりは2進数です。
よくハードディスクの容量が「〜バイト」などのように言いますが。これがその「バイト」に当たります。実際に「ギガ」とか「テラ」とか言われrてもわけがわからないので「1バイト」から見ていきます。

  1. 1byte = 00000000; の2進数です。「0」が8個あります。なので1バイト=8ビット(bit)です。
  2. 1bit = 0 or 1です。
  3. 10進数(1-10で数える普段使う数の数え方)の「3」は2進数で表現すると「11」になります。
  4. メモリ領域を1バイト分取ってあるならば「00000011」になります。左側の0はメモリの確保したぶんだけ付け加えて良いものになります。
    ちなみに127は「1111111」(1が7個)のデータになります。8個目のデータは「+ or -」を示す「サインビット」と呼ばれる物にあたるらしいです。

そんなわけで、byte変数の値がもつ数値の範囲は-127〜127になります。

char

「char型」の変数は1文字を表現するのに使用します。そして初期化するときは下のように実装します。
char ch = 'a';「'」シングルクォーテーションを使用して囲みます。
そして。byteで表現すると2byte文のデータ(つまり16ビット)整数だと「65535」になります。

boolen

Booleanは「True」と「Flase」です。この2つの値しかありません。
何に使用するかと言うと「条件分岐」です。

if文

サンプルで、変数「a」が1の時は"Hello"と表示、そうでない場合は"Good bye"と表示するプログラムを記載します。

public static void main(String[] args) {
    int a = 0;
    if (a == 1) {
       System.out.println("Hello");
    } else {
       System.out.println("Good bye");
    }
}

以上のようになります。

Java Basic Step1-3

Java はじめて5 〜変数について〜

今回は変数の扱いについて記載いたいます。
今までに、メインメソッド、普通のメソッドと記載していきました。今度はこれらの中に処理を作っていこうと言う次第です。

変数

変数とは、「箱」です。箱の中には全てのデータ〜クラスまでなんでも入ります。その変数には肩があり以下のようになっています。

変数の型

プリミティブ型
int型: 整数longに比べて小さい値
double型: 小数点ありの変数で使用する
char型: 1文字文のデータ
long型: int型より大きい値
float型: 小数点少し曖昧でも良い
参照型(下の表ではobject)
Stringとかクラスの型
配列など「int[]」のような変数の型

正直のところ、「float」に関してはあまり理解していないのですが、画像処理(座標計算)で使用する(0-1.0の範囲)小数点の値なのですが、doubleでも良いような気がする。。。がしかしLWJGLとかOpenGLなどではfloatを使用していました。
詳細な表に関してはこちらを参照ください。

Data Type Default Value (for fields)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object)   null
boolean false

変数の使い方

百聞は一見にしかず。。。変数の名前は重複しないように適当につけています。
変数の宣言と初期化、これでプログラム中で変数が使用可能になります。

// 宣言
int num;
// 初期化
int i = 0;

そして、変数の扱い方。例えば「1 + 1」を結果用の変数に入れて表示する処理です。サンプルコードはGithubにアップしてあります。

   public static void main(String[] args) {
        // 変数宣言
        int num1;
        // 変数に値0を再セット、以前の値は削除される
        num1 = 0;

        /* 変数の初期化
         * 変数の宣言時に、値を代入する
         * 変数 = 値(代入)
         */
        int num2 = 10;

        // 1.足し算
        num1 = num1 + num2 + 2;

        // 2.引き算
        num1 = num1 * (num1 - num2);

        // 3.掛け算
        num1 = num1 * 3;

        // 4.割り算
        num1 = num1 / 2;
        // 計算結果を表示
        System.out.println("計算結果" + num1);
    }

ちなみに、足し算引き算は「+」「-」で算数でやったのと同じ記号を使うのですが、掛け算や割り算はそれぞれ「*」(掛け算)、「/」(割り算)を使用します。

データ型の意味

正直のところ「int型は小さい値」とか記載していても「は?」となります。「じゃ、なんでそんな説明したんだ?」と聞かれそうですが。いかに説明します。

int型(整数値): -2147483648〜2147483648の範囲
char型          : 0〜65535の範囲
byte型          : -127〜127の範囲

などのように値の範囲が決まっています。具体的には下のようなコードを書いた時に、以下のような違いがあります。

ちなみにlong型の場合はint型との区別をするのに最後に「L」をつけます。

とりあえずは、「変数について」記載しました。実践に関しては次回以降と言うことで。。。

でわでわ。。。

Java Basic Step1-

*Java 四則演算 演算子 〜Step1-2: arithmetic calculation〜



Java はじめて4〜練習問題をやってみる〜

今回は、今まで学んだことを使用して「練習問題」を解いてみようと思います。答えは複数、もしかしたら人の数だけあるかもしれません。

前回まで(java はじめて1〜3)でクラスの作り方〜メソッドの作成方法について記載しました。ここら辺の理解を深めるための練習問題です。
自分でロジックを組んで、想定通りの処理を実装できる実力をつけてください。

練習問題

<練習問題1>
次のコードはビルドエラーが出ます。以下の部分を明確にしてプログラムが動くように修正して、実行結果を確認してください。

/** JavaDocコメントです。*/
public class HelloWorld {
   // コメントです。
   public static vod main(String[] args) {
      System.out.println('Hello World!');
   }
}

<練習問題2>
次のプログラムの間違い部分を修正し、コンパイル・実行できるように修正して、実行し結果を確認してください。

public class HelloWorkd2 {
    // JavaDocコメントではありません。
    public static void main(String args) {
        /* コメントです */
        System.out.println("こんにちは、世界"):
    }
}

<練習問題3>
コンソール画面に「OK! ガンタンク!」と出力するプログラムを作成してください。(ノーヒント)

関連ページ



Java はじめて3 〜コメントの書き方〜

今回は、コメントの書き方をやります。プログラムが小さくてすぐに終わるようなものであれば、コメントは不要かもしれませんが。超大作になった場合、コメントがないとわけがわからなくなります。「コードを覚えてればよくね?」と思った方は書かなくても良いでしょう(笑)。あとで苦労するのも良い経験になります。

コメントの書き方

コメントは大きく2種類あります。

  1. JavaDocコメント
  2. プログラム用コメント

このコメントはそれぞれに以下のように記述します。

// 通常の1行コメント

/* 
 * 複数行に渡るコメント、最近はあまり使われないように思える。。。。
 */

 /**
  * JavaDocコメント
  * @param メソッドの引数など、IDEを使用すれば自動出力してくれるので楽チンです。
  * @return メソッドの返却値です。
  * @see 参照するものURLやURI(ファイルパスとURLを含む)

簡単にはこんな感じです。
これで、クラスファイルが1000とか2000になっても大丈夫です(笑)。大規模開発でないとこうはなりませんが。。。

今回はコメントの書き方なので、他に記載することがありません。
でわでわ。。。

関連ページ

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Summary from Level1 to 5
  5. Java クラスの書き方〜ワンポイントレッスン的な〜