Javaに触れてみた
自己満の備忘録ですのでご容赦ください
いろいろ作ってみる
前回の続きです。
④4択クイズ応用
前回考えたこの機能の改善点
①[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]みたいにターミナルに配列の中身を表示させる時に[]を表示支えないようにする。
②選び直してください。の表示が出たら数字を入力できるようにする。多分繰り返し処理でできると思う。
③問題を増やす。
④問題をランダムで出題できるようにする。
⑤答えをランダム表示にできるようにする。
とりあえずできそうな所から手をつけます。②を改善します。
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引かれるため
現状の知識だとこの修正は難しいので、苦しいですがこんな感じにしました。
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
正解です!
理想とは違いますが、まあ良しとしましょう!
次に③を改善します。
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などの値型