List
Java練習問題 第20回では「ArrayList」についての問題を用意してあります。
問題 1 難易度 ★★★
以下の手順に従ってプログラムを作成してください。
① String 型の ArrayList を colorList という変数名で生成してください。
② colorList に”red”,”green”,”blue”,”white”,”black”を追加してください。
③ 繰返し文を用いて「番目の色は**です。」と出力してください。
実行例
1 番目の色は red です。
2 番目の色は green です。
3 番目の色は blue です。
4 番目の色は white です。
5 番目の色は black です。
問題 1 解答
正解は、、、
import java.util.ArrayList;
import java.util.List;
public class Main_1601 {
public static void main(String[] args) {
List<String> colorList = new ArrayList<String>();
colorList.add("red");
colorList.add("green");
colorList.add("blue");
colorList.add("white");
colorList.add("black");
for (int i = 0; i < colorList.size(); i++) {
System.out.println(i + 1 + "番目の色は " + colorList.get(i) + " です。");
}
}
}
問題 2 難易度 ★★★★
下記コードに追記して「国語」「数学」「英語」の三科目の試験結果集計プログラムを完成させてください。
① 実行例を参考にStudent 型の ArrayList を使用して生徒名と各科目の得点を入力するプログラムを作成してください。
② 入力が終了したら一覧表を表示します。
③ 実行例を参考に、選択式で「生徒ごとの合計点表示」「科目ごとの平均点表示」を行います。
※ 将来の科目数増減に簡単に対応できるよう、コード内の SUBJECTS 配列の要素数を変更した場合にも正しく動作するようにしてください。
public class Main_1602 {
public static final String[] SUBJECTS = { "国語", "数学", "英語" };
public static void main(String[] args) {
// 解答をここに記述してください。
}
}
class Student {
private String name;
private int[] scoreAry;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[] getScoreAry() {
return scoreAry;
}
public void setScoreAry(int[] scoreAry) {
this.scoreAry = scoreAry;
}
}
実行例
1 番目の生徒の名前を入力してください。(入力終了は数字の 0 を入力)
鈴木
鈴木さんの国語の点数を整数で入力してください。
22
鈴木さんの数学の点数を整数で入力してください。
33
鈴木さんの英語の点数を整数で入力してください。
44
2 番目の生徒の名前を入力してください。(入力終了は数字の 0 を入力)
佐藤
佐藤さんの国語の点数を整数で入力してください。
55
佐藤さんの数学の点数を整数で入力してください。
66
佐藤さんの英語の点数を整数で入力してください。
77
3 番目の生徒の名前を入力してください。(入力終了は数字の 0 を入力)
0
**成績一覧表**
国語 数学 英語
鈴木 22 33 44
佐藤 55 66 77
表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
1
鈴木さんの合計点は 99 点です。
佐藤さんの合計点は 198 点です。
表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
2
国語の平均点は 38 点です。
数学の平均点は 49 点です。
英語の平均点は 60 点です。
表示したい内容を数値で入力してください
1. 生徒ごとの合計点
2. 科目ごとの平均点
プログラム終了は、0 を入力してください
0
プログラムを終了しました
問題 2 解答
正解は、、、
import java.util.ArrayList;
public class Main_1602 {
public static final String[] SUBJECTS = { "国語", "数学", "英語" };
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<Student>();
while (true) {
Student student = new Student();
System.out.println(students.size() + 1
+ "番目の生徒の名前を入力してください。(入力終了は数字の 0 を入力)");
String name = new java.util.Scanner(System.in).next();
if (name.equals("0")) {
break;
}
student.setName(name);
int[] scores = new int[SUBJECTS.length];
for (int i = 0; i < SUBJECTS.length; i++) {
System.out.println(student.getName() + "さんの"
+ SUBJECTS[i] + "の点数を入力してください");
scores[i] = new java.util.Scanner(System.in).nextInt();
}
student.setScoreAry(scores);
students.add(student);
}
System.out.println();
System.out.println("**成績一覧表**");
//見出し行「 国語 数学 英語」を出力
for (int i = 0; i < SUBJECTS.length; i++) {
System.out.print("\t\t" + SUBJECTS[i]);
}
System.out.println();
//点数一覧を表示
for (Student s : students) {
System.out.print(s.getName() + "\t\t");
int[] scores = s.getScoreAry();
for (int i = 0; i < scores.length; i++) {
System.out.print(scores[i] + "\t\t");
}
System.out.println();
}
while (true) {
System.out.println("\n 表示したい内容を数値で入力してください");
System.out.println("1. 生徒ごとの合計点");
System.out.println("2. 科目ごとの平均点");
System.out.println("プログラム終了は、0 を入力してください");
int n = new java.util.Scanner(System.in).nextInt();
if (n == 1) {
//生徒ごとの合計点計算と表示
for (Student s : students) {
int sum = 0;
int[] scores = s.getScoreAry();
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
System.out.println(s.getName() + "さんの合計点は" + sum + "点です。");
}
} else if (n == 2) {
//科目ごとの平均点計算と表示
for (int i = 0; i < SUBJECTS.length; i++) {
int sum = 0;
for (Student s : students) {
sum += s.getScoreAry()[i];
}
System.out.println(SUBJECTS[i] + "の平均点は"
+ sum / students.size() + "点です。");
}
} else if (n == 0) {
break;
}
}
System.out.println("プログラムを終了しました");
}
}
class Student {
private String name;
private int[] scoreAry;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[] getScoreAry() {
return scoreAry;
}
public void setScoreAry(int[] scoreAry) {
this.scoreAry = scoreAry;
}
}
List 応用
問題 3 難易度 ★★★★
PC と対戦するポーカーゲームの一部を以下の手順に従って作成してください。
① Card.java を作成し、一枚のカードを表す Card クラスを定義してください。
Card クラスには、文字列型の suit フィールド(“♠”, “♦”, “♣”, “♥”のいずれかが格納される)と、文字列型の number フィールド(“A”, “2”, ..中略.. “J”, “Q”, “K”のいずれかが格納される)を定義してください。その他、必要となるメンバーなども適宜、定義してください。
② main メソッド内で Card オブジェクトを要素とする ArrayList を、変数名 dealerCards として生成し、52 枚分の Card オブジェクトを格納してください。
③ 生成済みのカード一式を 4 行 13 列で表示してください。
④ カード一式をシャッフルしてください。
⑤ シャッフル済みのカード一式を 4 行 13 列で表示してください。
⑥ ユーザー手持ちカードの List を、変数名 userCards として宣言し、dealerCards から先頭 5 枚分を取り出して、格納してください。
⑦ ユーザー手持ちカードを一行に表示してください。
⑧ PC 手持ちカードの List を、変数名 pcCards として宣言し、dealerCards から先頭 5 枚分を取り出して、格納してください。
⑨ PC 手持ちカードを一行に表示してください。
⑩ ディーラーの手元に残ったカードを 4 行 13 列で表示してください。
⑪プログラムを実行し、以下のことを確認してください。
*ユーザー、PC、ディーラーの手持ちカードに重複がない。
*シャッフル済みのカードから、正しく先頭 10 枚が取り出されているか。
※Visual Studio Codeだと実行時にカードのマークがうまく表示されない可能性があります。eclipseを使用して実行することをお勧めします。
実行例
カードを一式生成します
♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K
♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K
♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K
♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K
シャッフルします
♣10 ♣7 ♥9 ♦4 ♦2 ♠J ♥5 ♥3 ♣5 ♦5 ♣Q ♠4 ♦A
♣J ♠Q ♠2 ♦3 ♦K ♣3 ♥10 ♠7 ♦8 ♠K ♠9 ♠5 ♣A
♥7 ♣2 ♣9 ♥4 ♠A ♥8 ♣8 ♦6 ♦J ♥Q ♥2 ♣4 ♦9
♠6 ♠10 ♠3 ♠8 ♥K ♣K ♥6 ♣6 ♦Q ♥A ♥J ♦7 ♦10
プレイヤーに 5 枚配ります
♣10 ♣7 ♥9 ♦4 ♦2
PC に 5 枚配ります
♠J ♥5 ♥3 ♣5 ♦5
ディーラーの手元に残ったカードです
♣Q ♠4 ♦A ♣J ♠Q ♠2 ♦3 ♦K ♣3 ♥10 ♠7 ♦8 ♠K
♠9 ♠5 ♣A ♥7 ♣2 ♣9 ♥4 ♠A ♥8 ♣8 ♦6 ♦J ♥Q
♥2 ♣4 ♦9 ♠6 ♠10 ♠3 ♠8 ♥K ♣K ♥6 ♣6 ♦Q ♥A
♥J ♦7 ♦10
問題 3 解答
正解は、、、
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main_1603 {
public static void main(String[] args) {
System.out.println("カードを一式生成します");
List<Card> dealerCards = new ArrayList<Card>();
for (int i = 0; i < Card.SUIT_ARRAY.length; i++) {
for (int j = 0; j < Card.NUMBER_ARRAY.length; j++) {
dealerCards.add(new Card(i, j));
}
}
showCards(dealerCards);
System.out.println("シャッフルします");
Collections.shuffle(dealerCards);
showCards(dealerCards);
System.out.println("プレイヤーに 5 枚配ります");
List<Card> playerCards = distribute(dealerCards, 5);
showCards(playerCards);
System.out.println("PC に 5 枚配ります");
List<Card> pcCards = distribute(dealerCards, 5);
showCards(pcCards);
System.out.println("ディーラーの手元に残ったカードです");
showCards(dealerCards);
}
public static void showCards(List<Card> list) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + "\t");
if (i % Card.NUMBER_ARRAY.length == Card.NUMBER_ARRAY.length - 1) {
System.out.println();
}
}
System.out.println();
}
public static List<Card> distribute(List<Card> cards, int num) {
List<Card> newCardList = new ArrayList<Card>();
for (int i = 0; i < num; i++) {
newCardList.add(cards.get(0));
cards.remove(0);
}
return newCardList;
}
}
class Card {
public static final String[] SUIT_ARRAY = { "♠", "♦", "♣", "♥" };
public static final String[] NUMBER_ARRAY = {
"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
//注:上記のように、配列を final としても各要素は書き換え可能です。
// このサンプルでは割愛していますが、配列を定数として使いたい場合は、
// Collections クラスの unmodifiableList メソッドを使用してください。
private String suit;
private String number;
public Card(int suit, int number) {
this.suit = SUIT_ARRAY[suit];
this.number = NUMBER_ARRAY[number];
}
@Override
public String toString() {
return suit + number;
}
}
Java練習問題 第21回では「ラッパークラス」から出題します。
コメント