LoginSignup
1
0

More than 3 years have passed since last update.

Javaに初めて触れてみた④

Posted at

Javaに触れてみた

自己満の備忘録ですのでご容赦ください

いろいろ作ってみる

前回の続きです。

④4択クイズ応用

前回考えたこの機能の改善点
①[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]みたいにターミナルに配列の中身を表示させる時に[]を表示支えないようにする。
②選び直してください。の表示が出たら数字を入力できるようにする。多分繰り返し処理でできると思う。
③問題を増やす。
④問題をランダムで出題できるようにする。
⑤答えをランダム表示にできるようにする。

とりあえずできそうな所から手をつけます。②を改善します。

Test4.java
import java.util.Scanner;

import java.util.ArrayList;
import java.util.List;

class Test4 {
  public static void main(String args[]) {
    List<String> array = new ArrayList<String>();
    array.add("[1]明治大学");
    array.add("[2]法政大学");
    array.add("[3]早稲田大学");
    array.add("[4]立教大学");

    for (int i = 0; i <= 3; i++) {
      System.out.println("2019年ドラフト1位の森下選手の出身大学は?");
      System.out.println(array);
      Integer number = new Scanner(System.in).nextInt();

      if (number == 1) {
        System.out.println("正解です!");
        break;
      } else {
        array.remove(number - 1);
        System.out.println("間違いです");
        System.out.println("番号を選び直してください。");
      }
    }
  }
}
ターミナル
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [3]早稲田大学, [4]立教大学]
1
正解です!

↑正解パターン
break;を書いたので、繰り返しが止まりました。

ターミナル
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
2
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [3]早稲田大学, [4]立教大学]
1
正解です!

↑1度間違えて正解のパターン
いい動きです。

ターミナル
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
3
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [2]法政大学, [4]立教大学]
4
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
        at java.base/java.util.Objects.checkIndex(Objects.java:359)
        at java.base/java.util.ArrayList.remove(ArrayList.java:504)
        at Test4.main(Test4.java:23)

↑問題が起きました。
間違えた後に4を選ぶと、配列上は3個目にあるので配列上の数字(2)と入力した数字(3)に齟齬ができてしまいます。
※2と3は入力した数値から1引かれるため

現状の知識だとこの修正は難しいので、苦しいですがこんな感じにしました。

Test4.java
import java.util.Scanner;

import java.util.ArrayList;
import java.util.List;

class Test4 {
  public static void main(String args[]) {
    List<String> array = new ArrayList<String>();
    array.add("[1]明治大学");
    array.add("[2]法政大学");
    array.add("[3]早稲田大学");
    array.add("[4]立教大学");

    for (int i = 0; i <= 3; i++) {
      System.out.println("2019年ドラフト1位の森下選手の出身大学は?");
      System.out.println(array);
      Integer number = new Scanner(System.in).nextInt();

      if (number == 1) {
        System.out.println("正解です!");
        break;
      } else {
        array.set(number - 1, "");
        System.out.println("間違いです");
        System.out.println("番号を選び直してください。");
      }
    }
  }
}

array.remove(number - 1);で要素を削除していましたが、
array.set(number - 1, "");で空欄を作ることによって要素数のズレを無くしました。

ターミナル
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
2
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, , [3]早稲田大学, [4]立教大学]
3
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, , , [4]立教大学]
4
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, , , ]
1
正解です!

理想とは違いますが、まあ良しとしましょう!

次に③を改善します。

Test5.java
import java.util.Scanner;

import java.util.ArrayList;
import java.util.List;

class Test5 {
  public static void main(String args[]) {
    List<String> array01 = new ArrayList<String>();
    array01.add("[1]明治大学");
    array01.add("[2]法政大学");
    array01.add("[3]早稲田大学");
    array01.add("[4]立教大学");

    for (int i = 0; i <= 3; i++) {
      System.out.println("2019年ドラフト1位の森下選手の出身大学は?");
      System.out.println(array01);
      Integer number = new Scanner(System.in).nextInt();

      if (number == 1) {
        System.out.println("正解です!");
        break;
      } else {
        array01.set(number - 1, "");
        System.out.println("間違いです");
        System.out.println("番号を選び直してください。");
      }
    }

    List<String> array02 = new ArrayList<String>();
    array02.add("[1]明治大学");
    array02.add("[2]法政大学");
    array02.add("[3]東洋大学");
    array02.add("[4]亜細亜大学");

    for (int i = 0; i <= 3; i++) {
      System.out.println("2019年ドラフト2位の宇草選手の出身大学は?");
      System.out.println(array02);
      Integer number = new Scanner(System.in).nextInt();

      if (number == 2) {
        System.out.println("正解です!");
        break;
      } else {
        array02.set(number - 1, "");
        System.out.println("間違いです");
        System.out.println("番号を選び直してください。");
      }
    }

    List<String> array03 = new ArrayList<String>();
    array03.add("[1]花咲徳栄高校");
    array03.add("[2]敦賀気比高校");
    array03.add("[3]霞ヶ浦高校");
    array03.add("[4]大船渡高校");

    for (int i = 0; i <= 3; i++) {
      System.out.println("2019年ドラフト3位の鈴木選手の出身高校は?");
      System.out.println(array03);
      Integer number = new Scanner(System.in).nextInt();

      if (number == 3) {
        System.out.println("正解です!");
        break;
      } else {
        array03.set(number - 1, "");
        System.out.println("間違いです");
        System.out.println("番号を選び直してください。");
      }
    }
  }
}
ターミナル
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
2
間違いです
番号を選び直してください。
2019年ドラフト1位の森下選手の出身大学は?
[[1]明治大学, , [3]早稲田大学, [4]立教大学]
1
正解です!
2019年ドラフト2位の宇草選手の出身大学は?
[[1]明治大学, [2]法政大学, [3]東洋大学, [4]亜細亜大学]
1
間違いです
番号を選び直してください。
2019年ドラフト2位の宇草選手の出身大学は?
[, [2]法政大学, [3]東洋大学, [4]亜細亜大学]
3
間違いです
番号を選び直してください。
2019年ドラフト2位の宇草選手の出身大学は?
[, [2]法政大学, , [4]亜細亜大学]
2
正解です!
2019年ドラフト3位の鈴木選手の出身高校は?
[[1]花咲徳栄高校, [2]敦賀気比高校, [3]霞ヶ浦高校, [4]大船渡高校]

3
正解です!

とりあえず同じ機能を3つ並べてみました。
機能としては問題なしです。
ただ、もう少しコンパクトにできるとは思います。たぶん。

おまけ

①ArrayListと配列は違う

これは調べていくうちに分かりました。最初は同じものだと思っていました。
【違い】
・ArrayListはサイズ(要素数)が可変
・宣言方法が違う
・ArrayListはプリミティブ型が入らない
プリミティブ型 intやbooleanなどの値型

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0