TxKxZxWx's blog

AWS SAA、Javaの学習

Java学習 14日目 おさらい②, 「replace - 文字列を置換」

今までのおさらい②

 

 

・「2次元配列をループで処理する」

 

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

for (int i = 0; i < teams.length; i++) {
  for(int j = 0; j < teams[i].length; j++) {
    System.out.print(teams[i][j] + " ");
  }
  System.out.println ( " " );
  System.out.println ( "---" );

 

 

二次元配列をループで処理するにはfor文を2つ組み合わせる。

.lengthによって最初のfor文では{"勇者", "戦士", "魔法使い"}, {"盗賊", "忍者", "商人"}, {"スライム", "ドラゴン", "魔王"}の要素数を。

2番目のfor文では{"勇者", "戦士", "魔法使い"}の中の要素数を求めている。

 

これを拡張for文で出力すると以下のようになる。

 

 

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

for (String team : teams) {
  for (String player : team) {
    System.out.print(player + " ");
  }
  System.out.println("");
  System.out.println("---");

 

 

 

 

・「2次元配列をnewで作成する」

 

newメソッドによって新しい配列を作ることができる。

 

例題:

2次元配列を作成して、ループで出力しています。
この配列の初期値を、全て1にして出力してください。

 

期待する出力値:
111
111

 

解答:

int array = new int[2][3];

for (int i = 0; i < array.length; i++) {
  for (int j = 0; j < array[i].length; j++) {
    array [i] [j] = 1;
    System.out.print( array [i] [j] );

 

 

 

int array = new int[2][3]; によって2列3行の二次元配列が新たに作られる。

array [i] [j] = 1; で初期値を設定。

 

 

 

・メソッドについて

 

メソッドとはコードを分割して、共通で利用するための機能。

大規模プログラムの開発で必要。

例えばSystem.out.printlnやMath.random()など。

 

「メソッドの働き」

  • コードを分割して整理できる。
  • コードに名前を付けられる。
  • コードを何度も呼び出せる。
  • コードを組み合わせできる。

同じ働きのコードを一箇所に集めることにより見通しが良くなる。

同じコードを何度も呼び出せるため、同じ処理を行うプログラムを繰り返し作る必要もなくなり開発効率も上がる。

 

 

 

・メソッドの作り方

 

public class Main {
  public static void main(String args) {

  sayHello (); //sayHelloメソッドを呼び出して出力

  sayHello ();

  }


  public static void sayHello() {  //sayHelloメソッドを定義

    System.out.println ( "hello paiza" );

  }

}

 

⬇︎

 

hello paiza

hello paiza

 

 

メソッド名の先頭は小文字、単語の区切りで大文字にする。

動詞を表す単語と名詞を組み合わせるとどんな処理をするメソッドかわかりやすい。

 

 

 

・引数と戻り値を追加する

 

メソッドを呼び出した後、計算結果を使って別の処理を呼び出す

 

public class Main {
  public static void main(String args) {
    int num1 = sum(3, 4);
    System.out.println(num1);
    int num2 = sum(300, 400);
    System.out.println(num2);
  }

  public static int sum(int x, int y) {
    return x + y;
  }
}

 

 

メソッドで戻り値を返す場合はintの部分を戻り値のデータ型に合わせる。

sumメソッドを呼び出して引数を使って計算して、その処理結果をreturnで戻り値にする。

それをnum1変数に代入してprintlnで呼び出している。

 

 

 

RPGの攻撃シーンを作る(メソッド使用)

 

// RPGの攻撃シーンを作ろう
public class Main {
  public static void main(String args) {
    String enemies = {"スライム", "モンスター", "ドラゴン"};
    for (String enemy : enemies) {
      attack(enemy);
    }
  }

  public static void attack(String target) {
    System.out.println("勇者は、" + target + "を攻撃した。");
    int hit = (int) (Math.random() * 10 + 1);
    if (hit < 6) {
      System.out.println(target + "に、" + hit + "のダメージを与えた!");
    } else {
      System.out.println("クリティカルヒット!" + target + "に、100のダメージを与えた!");
  }
}
}

 

 

 

まずenemies配列にモンスター達を格納し、それを拡張for文で全て呼び出す準備をする。

そしてattackメソッド(引数はtarget)を作り、勇者が攻撃する文章作成。

そしてランダムにクリティカルヒットが出る文をMath.randomで作る。

 

 

 

 

・ブロックのスコープを理解する

 

public class Main {
  public static void main(String args) {
    System.out.println("hello world");
    int num = 0;
    if (num == 0) {
      String msg = "pazia";
      System.out.println(msg + num);
    }
    //System.out.println(msg1); // エラーになる

    for (int i = 1; i < 5; i++) {
      String msg = "Java";
      System.out.println(msg + i);
    }
    //System.out.println(msg); // エラーになる
  }
}

 

ブロックの中で宣言されたローカル変数は、ブロックの外では利用できない。

上記の例ではmsgメソッドはブロックの中で定義されているので、ブロックの外で呼び出そうとするとエラーがでてしまう。

 

 

 

 

・文字列を置換する:replace()
「Leet文字列」

 

文字列を置換するにはreplaceメソッドを使う。

replace() を使うときは以下のように記述します。

 

対象の文字列.replace(置換される文字列, 置換する文字列)


replace() は、対象の文字列から第1引数で指定した文字列を検索し、マッチした文字列を第2引数で指定した文字列で置換します。そして、置換後の文字列を戻り値として返します。

以下は、replace() を使用したサンプルです。

 

String str1 = "abc123abc123";
String str2 = str1.replace("abc", "0");
  System.out.println(str2); // 01230123
1
2
3


上のプログラムでは、文字列 abc123abc123 の中にある文字列 abc を 0 に置換しています。結果として、置換後の文字列 01230123 が表示される。

 

 

例題:

 

Leet と呼ばれるインターネットスラングがあります。

Leet ではいくつかのアルファベットをよく似た形の他の文字に置き換えて表記します。

Leet の置き換え規則はたくさんありますが、ここでは次の置き換え規則のみを考えましょう。

A → 4

E → 3

G → 6

 I → 1

O → 0

S → 5

Z → 2

文字列が入力されるので、これを Leet に変換して出力するプログラムを書いてください。

 

 

解答:

 

import java.util.*;


public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String s = sc.next();
    int len = s.length();
    if(1 <= len && len <= 100){  //入力は1~100まで
      s = s.replace("A","4");
      s = s.replace("E","3");
      s = s.replace("G","6");
      s = s.replace("I","1");
      s = s.replace("O","0");
      s = s.replace("S","5");
      s = s.replace("Z","2");

      System.out.println(s);
    }
  }
}

 

 

String は不変オブジェクトなので、replace メソッドを実行しても変数sの中身が書き変わらない。
端的に動くようにするなら、replace の結果を都度 s に代入する。