TxKxZxWx's blog

AWS SAA、Javaの学習

Java学習 13日目 おさらい

「今までのおさらい」

 

 

・ランダムで数値表示


double rand = Math.random() * 100 + 1;

int number = (int)rand;

System.out.println("スライムが" + number + "匹あらわれた");


double →小数点以下の数値を扱うことのできるデータの種類
Math.random() →「ランダムメソッド」0から1までのランダムな数値を出力する。
(int)rand; →(int)により続く値を整数に変換する。(小数点を切り捨てる)
*100 →何個の数から一つを選ぶか。
+1 →選ばれる数値がいくつから始まるか。
⚪︎引数 →メソッドに与えるデータ。
     引数は、メソッドに続くカッコの中に記述する。

⚪︎戻り値 →メソッドの処理結果のデータ。返り値と呼ぶ場合もある。

 

 

四則演算も混ぜると以下のようになる。

public class Main {

 public static void main(String[] args)

  { int number =(int)(Math.random() * 10 + 1); // 匹数 1 ~ 10

  System.out.println("体重100キロのスライムが、" + number + "匹あらわれた。");

  int weight = 100 * number;

  System.out.println("スライムの合計体重は、" + weight + "キロです。"); }}

 

⇨「体重100キロのスライムが、6匹あらわれた。スライムの合計体重は、600キロです。」

のようにランダムで計算するシステムができる。

 

 

 

・IF文による条件分岐

 

int number =(int)(Math.random() * 3 + 1);

System.out.println("あなたの順位は" + number + "位です。");

if (number == 1){   // 条件式1が成立したときの処理
         // ==は右辺と左辺が等しい時の意味

 System.out.println("おめでとう!");

} else if (number == 2) {  // 条件式2が成立したときの処理

 System.out.println("あと少し!");

}

} else {  // 条件式がどれも成立しなかったときの処理

System.out.println("ざんねん!");

}

 

⇨あなたの順位は1位です。おめでとう!

(順位がランダムで一位だった時のみ「おめでとう」が表示される。)

 1位のときはおめでとう!

 2位のときはあと少し!

 それ以外の順位の場合はざんねん!が表示される。

 

 

「条件分岐」

  • and... 条件式1 && 条件式2

    「条件式1 && 条件式2」は、条件式1と条件式2が両方ともtrueのときにtrue、それ以外(どちらかの条件式がfalse)のときにfalseを返します。

  • or... 条件式1 || 条件式2

    「条件式1 || 条件式2」は、条件式のどちらかがtrueのときにtrue、それ以外はfalseを返します。

  • not... 条件式

    ! 条件式」は、条件式がtrueのときにfalse、条件式がfalseのときにtrueを返します。

 

 

 

・条件によるくり返し処理 - while

  

基本形:

 

// カウンタ変数を初期化

while (条件式) {

// 繰り返し処理

// カウンタ変数を更新

}

 

 

例:

public class Main {

  public static void main(String args) {

    int i = 0;  // カウンタ変数の初期化

    while (i <= 5) {  // 0 -> 1 -> 2 -> 3 ・・・ 5 -> 6

      System.out.println("hello world " + i);  // 繰り返し処理

      i = i + 1;  // カウンタ変数の更新

    }

    System.out.println("last " + i);

  }

}

 

⬇︎

hello world0

hello world1

hello world2

hello world3

hello world4

hello world5

last6

 

解説:i変数に1が追加され5になるまでprintln処理が繰り返される。

6になると i <= 5 が適用されないのでループから抜ける。

※カウンタ変数の更新を忘れると無限ループになってしまうので注意!

 

 

・条件によるくり返し処理 - for

 

基本形:

for(カウンタ変数を初期化; 条件式; カウンタ変数を更新) {

// 繰り返し処理

}

 

 

例:

int i;

for(i = 0; i <= 2; i++) {

System.out.println("hello world " + i);  // 繰り返し処理

}

System.out.println("last " + i);

 

⬇︎

hello world0

hello world1

hello world2

 

 

※i変数はループの中でしか使えない。

ループの外でも変数を使う場合は先に変数を宣言しておく必要がある。

 

 

「while」と「for」文の使い分け

 

回数が決まってる繰り返しは「for」
開始と終了のインデックスが決まっている繰り返し処理は、「for」文が適している。

逆に繰り返す回数が事前に分かっていない場合は、「while」文が適している。

例えば、ファイルを読み込む処理などは「while」を使う。

 

 

 

・標準入力でデータを読み込む - scanner

 

標準入力に対応するようにプログラムを作っておけば、プログラム実行時にファイルを読み込んだり、キーボードからデータを読み込んだり、パラメータを指定したりというように、入力先を切り替えることができる。

 

 

「標準入力から文字列の読み込み」

import java.util.*; //データを読み込むためのライブラリをインポート

public class Main {
   public static void main(String args) {
    Scanner sc = new Scanner(System.in); //scannerを宣言
    String data = sc.next(); //標準入力から読み込まれたデータがdata変数に代入される
    System.out.println("hello" + data );

 

⬇︎

例:japanと入力されると「hello japan」と表示される。

Scannerで宣言されたsc変数が標準入力の入り口になっており、そこからnextメソッドで取り出したデータをdata変数に代入している。

 

 

「標準入力から数値の読み込み」

import java.util.*;

public class Main {
   public static void main(String args) {
    Scanner sc = new Scanner(System.in);
    int data = sc.nextInt();
    System.out.println(data);

 

nextIntメソッド

→ 数値として読み込むためには整数型(stringをintに)にしてnextの後にInt( Iは大文字)

 

 

・入力されたデータが文字列ならString data = sc.next();

・入力されたデータが数値ならint data = sc.nextInt();

 

 

 

 

・複数データの読み込み - scanner & for

 

scannerにfor文を組み合わせることで複数のデータ読み込み処理ができる。

 

import java.util.*;

public class Main {
   public static void main(String args) {
    Scanner sc = new Scanner(System.in);
    int count = sc.nextInt();   // 3をカウント変数に代入

    String data;
    for (int i = 0; i < count; i++) {
      data = sc.next();
      System.out.println(data + "は、スライムを攻撃した");

    }

 

⬇︎

3

勇者

魔道士

戦士

 

と入力すると以下のように表示される。

勇者は、スライムを攻撃した

魔道士は、スライムを攻撃した

戦士は、スライムを攻撃した

 

 

 

・配列

 

配列とは複数のデータをひとまとめにする変数のセットのようなもの。

fruitsという箱に"りんご","みかん","いちご","メロン","バナナ"を格納し、

fruits[2]などで呼び出すイメージ。

番号は0から始まる。

 

配列の記述法:

String team = {"戦士", "忍者"};

 

配列の出力法:

System.out.println(team[0]);

 

以下のように変数を格納し、呼び出すこともできる。

String player_1 = "勇者";
String team = {"戦士", "忍者", player_1};
System.out.println(team[2]);

 

 

 

「ループで配列を処理する」

 

配列にループ処理を組み合わせる。

 

・配列の長さを調べる

以下の記述で配列の中に入っている要素の数がわかる。

 

String team = {"勇者", "戦士", "魔法使い"};
System.out.println(team.length);

⬇︎

3

 

 

・ループで配列を出力する

以下の記述をすると要素の中身が出力できる。

 

String team = {"勇者", "戦士", "魔法使い"};
for (int i = 0; i < team.length; i++) {
System.out.println(team[i]);
}

⬇︎

勇者

戦士

魔法使い

 

 

 

拡張for文

 

拡張for文とは、配列やコレクションと呼ばれる複数の要素を持っているものから全ての要素に含まれる値を順に取り出して処理できる。

 

int numbers = {12, 34, 56, 78, 90};
int sum = 0;
for (int i : numbers) {
sum += i;
}
System.out.println(sum);

 

 

 

ArrayListクラス

 

ArrayListクラスは、配列の要素を後から変更、追加、削除などすることができる。

 

 

ArrayListを作成する」

import java.util.*;
ArrayList<String> team = new ArrayList<String>();

 

ArrayListの要素を追加する」 - addメソッド

team.add("勇者");
team.add("魔法使い");

 

ArrayListの要素を個別で取り出して出力する」 - getメソッド

System.out.println(team.get(0));

 

ArrayListの要素をループで出力する」

for (String member : team) {
System.out.println(member);
}

 

ArrayListのサイズを出力する」- sizeメソッド

System.out.println(team.size());

 

ArrayListの要素を更新する」 - setメソッド

team.set(1, "忍者");

 


ArrayListの要素を削除する」 - removeメソッド

team.remove(1);

 

 

 

 

文字列を分割する - splitメソッド


「splitメソッドは対象となる文字列を指定した区切り文字によって分割し、それぞれを配列の要素として格納する。」

 

String array = data.split ( " , " );

 

 

例題:

下のコードエリアのプログラムは、入力エリアのURLを読み込みます。
読み込んだURLを「/」で分割して、配列の各要素をprintlnメソッドで出力してください。

 

入力される値:
https://paiza.jp/cgc/users/ready

 

期待する出力値:
https:

paiza.jp
cgc
users
ready

 

 

解答:

import java.util.*;

 

public class Main {
  public static void main(String args) {
    Scanner sc = new Scanner(System.in);
    String url_str = sc.next();
    String url = url_str.split ( " / " );
    for (String s : url) {
      System.out.println(s);
    }
  }
}

 

 

 

配列に複数行データを読み込む - hasNextLineメソッド

 

 

標準入力から読み込む行数が事前に分からない場合に複数行読み込むには以下のように

while (sc.hasNextLine()) { } を追加する。

 

import java.util.*;
public class Main {
  public static void main(String args) {
    Scanner sc = new Scanner(System.in);

    while (sc.hasNextLine()) {
      String data = sc.nextLine();
      System.out.println(data);
    }
  }
}

 

 

hasNextLineメソッドは入力する行がまだあるか確認するメソッド。

行があればnextLineメソッドで行データを読み込む。

そしてデータを正常に読み込めなかったり、複数行読み込み終わったらループを終了する。

 

 

補足:

nextLine()は、現在の行が空であっても残りを読み取る。
nextInt()は整数を読み取るが、エスケープシーケンス「\ n」は読み取らない。
next()は現在の行を読み取るが、「\ n」は読み取らない。

 

 

「標準入力で読み込んだ複数行データを配列に格納する」

 

読み込んだデータを配列に追加し、ループの後にまとめて表示する。

読み込むデータの数が事前にわからないのでArrayListに追加する。

 

import java.util.*;
public class Main {
  public static void main(String args) {
    Scanner sc = new Scanner(System.in);
    ArrayList<String> array = new ArrayList<String>();

    while (sc.hasNextLine()) {
      String data = sc.nextLine();
      array.add(data);
    }

    for(String str : array) {
      System.out.println(str);
    }
  }
}

 

 

whileで複数のデータを読み込み、ループの中でArrayListにデータを追加する。

そして読み込むデータが無くなったらループを抜けて、拡張for文で中身をまとめて出力。

 

 

 

例題:

下のコードエリアのプログラムは、入力エリアから複数行データとして読み込みます。
入力エリアには、RPGの敵の名前Aと匹数Bが、カンマ区切りで用意してあります。
読み込んだデータをカンマで分割して、「AがB匹現れた」と出力してください。

 

入力される値:
スライム,30
モンスター,23
ゾンビ,15
ドラゴン,3
魔王,1

 

期待する出力値:
スライムが30匹現れた
モンスターが23匹現れた
ゾンビが15匹現れた
ドラゴンが3匹現れた
魔王が1匹現れた

 

 

解答:

 

import java.util.*;
public class Main {
  public static void main(String args) {
    Scanner sc = new Scanner(System.in);

    while (sc.hasNextLine()) {
    String line = sc.nextLine();
    String enemy = line.split(",");
    System.out.println (enemy[0] + "が" + enemy[1] + "匹現れた");
    }
  }
}

 

 

 

・「ランダムなメッセージを表示」

 

 

import java.util.*;
public class Main {
  public static void main(String args) {
    Scanner sc = new Scanner(System.in);
    String data = sc.nextLine();
    String array = data.split(",");

    for (String enemy : array) {
      System.out.println(enemy + "が現れた");
    }

 

// ランダムな数の範囲を作る。 - lengthで配列の要素数を調べる。

    int num = array.length;

    System.out.println( "敵は" + num "匹");

 

// ランダムな数を生成。 - randメソッドで生成したランダムな数を要素数倍すると、配列のインデックスから一つを選ぶことができる。

    double rand = Math.random() * num;

    int attack = (int)rand;

 

// 選んだ敵に、「会心の一撃!」と表示。- array[attack]の部分でarray配列の要素をattack変数で指定している。

attack変数は上の int attack = (int)rand; で配列のインデックスからランダムに一つを選んでいる。

    System.out.println(array[attack] + "に会心の一撃"

    + array[attack] + "を倒した!" );
  }
}

 

 

 

・「2次元配列」

 

2次元配列とは、「2つのインデックスで要素を指定する配列」のこと。


例えば、

array[1][2] = 100;

 

とすると、インデックスの1,2に対応する要素に100を代入できる。

 

 

多次元配列の用途は以下のようなもの。

 

- RPGのマップ
- 写真・イラストなどのイメージ
- 3D-CGの空間座標
- ゲームの盤面
- 表形式データ

 

 

 

例:

String teams = {{"勇者", "戦士", "魔法使い"}, {"盗賊", "忍者", "商人"}, {"スライム", "ドラゴン", "魔王"}};

System.out.println(teams[0][0]);
System.out.println(teams[0][1]);
System.out.println(teams[0][2]);

 

⬇︎

勇者

戦士

魔法使い

 

 

解説:

二次元配列を作成する場合は最初にString, Intなど配列の要素になるデータの種類を記述して、その後にを記述する。

そしてprintlnで出力する際はインデックスの番号を二つ記述する。

上の場合は最初の[0]でteams配列に入った{"勇者", "戦士", "魔法使い"}を指定。

2番目の[0]で{"勇者", "戦士", "魔法使い"}の中の0番=勇者を指定している。