TxKxZxWx's blog

AWS SAA、Javaの学習

Java学習 8日目 「splitメソッド」「hasNextLineメソッド」「ランダム」

・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] + "を倒した!" );
  }
}

 

 

 

例題①:

入力エリアに、おみくじの出目(例:大吉,中吉,吉,凶)が用意してあります。
おみくじプログラムを作ってください。
おみくじは、標準入力から読み込んだ文字列をカンマで分割して、そのうち1つをランダムに出力します。

 

入力される値:
大吉,中吉,吉,凶

 

期待する出力値:
大吉,中吉,吉,凶のいずれか

 

 

解答:

import java.util.*;
public class Main {
  public static void main(String args) {
    // 標準入力から1行取得
    Scanner sc = new Scanner(System.in);
    String line = sc.nextLine();

    // カンマで分割して、配列に代入
    String[] omikuji = line.split(",");

    // 配列の要素をランダムに選ぶ
    double rand = Math.random() * omikuji.length;
    int num = (int)rand;

    // ランダムに選んだ配列の要素を出力
    System.out.println(omikuji[num]);
 }
}