Javaに初めて触れてみた④

# Javaに触れてみた
自己満の備忘録ですのでご容赦ください

## いろいろ作ってみる
前回の続きです。

### ④４択クイズ応用
前回考えたこの機能の改善点
①[[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
正解です！
```
↑１度間違えて正解のパターン
いい動きです。

```:ターミナル
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)
```
↑問題が起きました。
間違えた後に４を選ぶと、配列上は3個目にあるので配列上の数字(2)と入力した数字(3)に齟齬ができてしまいます。
※２と３は入力した数値から１引かれるため

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

```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などの値型