未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の応用問題1-1

title


答えの確認は、オンラインプログラミングスクール
未来エンジニア養成所Logo


オブジェクト指向の応用問題1-1

問題3-1

FileCopyPracticeクラスのmainメソッドは未完成です。

あるテキストファイルの内容を、別のテキストファイルにコピーするプログラムを作成してください。


その方法は、コピー元ファイルからFileReaderクラスとBufferedReaderクラスをうまく使ってデータを読み取り、そのデータをコピー先ファイルにFileWriterクラスとBufferedWriterクラスとPrintWriterクラスをうまく使って書き込みます。


コピー元ファイル名およびコピー先ファイル名の指定にはコマンドライン引数を使用してください。


【実行例】

> java FileCopyPractice コピー元ファイル名 コピー先ファイル名


コマンドラインが不正(2つの文字列が渡ってこない)の場合は「2つのファイル名を正しく指定してください」と表示してプログラムを終了します。


コピー元ファイルが見つからない場合はFileNotFoundExceptionがスローされます。
その際は「ファイル名の指定が不正です」と表示してプログラムを終了します。


それ以外にIOExceptionがスローされますので、そのときは「入出力エラーです」と表示してプログラムを終了します。


オープンしたファイルは適切にクローズしてください。


【FileCopyPractice.java】

public class FileCopyPractice {
    public static void main(String[] args) {

        // ここにファイルコピー処理を記述してください

    }
}


解答例


TOPに戻る


問題3-2

英数字の単語を格納するArrayList型の変数numberがあり、zeroからtenまでの英数字の単語が格納されています。


次に、「0から10までの英単語を入力してください」と出力し、ユーザに英単語を入力してもらいます。


ArrayList型の変数numberをfor文を用いて順にみていき、入力英単語と文字列の一致を確認します。
もし一致した場合は「○○は数値の△です」と表示します。
もしすべて一致しなければ「○○は英単語として存在しません」と表示します。
(下記実行結果を参考にしてください)


【実行結果】

0から10までの英単語を入力してください
five
fiveは数値の5です
0から10までの英単語を入力してください
eit
eitは英単語として存在しません


【ArrayListBasicPractice.java】

import java.util.*;
public class ArrayListBasicPractice {
    public static void main(String[] args) {

        // 英数字単語格納用変数の宣言とArrayListオブジェクトの生成
        ArrayList<String> number = new ArrayList<String>();

        // 英数字単語の格納
        number.add("zero");
        number.add("one");
        number.add("two");
        number.add("three");
        number.add("four");
        number.add("five");
        number.add("six");
        number.add("seven");
        number.add("eight");
        number.add("nine");
        number.add("ten");

        // 英単語の入力
        System.out.println("0から10までの英単語を入力してください");

        String input = System.console().readLine();


        // ここからコーディングしてください


    }
}


解答例


TOPに戻る


問題3-3

デジカメを表現するDigitalCameraクラスと、画像を表現するPictureクラスを作成してください。


また、デジカメクラスを使用するArrayListNormalPracticeクラスのmainメソッドは完成しています。
(変更は禁止です)


【Pictureクラス】

  1. 被写体を表現するインスタンスフィールドtarget(String型)を定義します。

  2. 被写体(String型)を引数に受け取るコンストラクタを定義します。
    引数で受け取った値を、インスタンスフィールドに格納してください。

  3. オブジェクトの説明文を文字列として戻すためのtoStringメソッドをオーバーライドしてください。
    戻り値として返す値は「○○の画像」という文字列です。


【DigitalCameraクラス】

  1. 撮影した画像を管理するArrayList型のメモリインスタンスフィールドmemoryを定義します。

  2. 引数なしコンストラクタを定義します。
    その中で、メモリインスタンスフィールドのオブジェクトを生成します。

  3. 画像撮影メソッドtakePictureを定義します。
    引数は被写体(String型)で、戻り値はありません。
    「○○を撮影しました」と出力した後にメモリオブジェクトに画像オブジェクトを登録します。

  4. 画像一覧表示メソッドshowPicturesを定義します。
    引数・戻り値はなしです。
    まず「★☆ 画像一覧 ☆★」と出力し、拡張for文を用いて画像の情報を順に出力します。

  5. 保存画像数取得メソッドgetPictureCountを定義します。
    引数はなしで、戻り値は保存数(int型)です。
    メモリオブジェクトに格納されている画像オブジェクトの個数を戻り値として返します。

  6. 画像全消去メソッドclearMemoryを定義します。
    引数・戻り値はなしです。
    「すべての画像を消去しました」と出力し、メモリオブジェクトに格納されているすべての画像オブジェクトをクリアします。


【実行結果】

子猫を撮影しました。
ランチを撮影しました。
カプチーノを撮影しました。
赤ちゃんを撮影しました。
ツーショットを撮影しました。

現在の撮影枚数:5

★☆ 画像一覧 ☆★
子猫の画像
ランチの画像
カプチーノの画像
赤ちゃんの画像
ツーショットの画像

すべての画像を消去しました

現在の撮影枚数:0


【ArrayListNormalPractice.java】

public class ArrayListNormalPractice {
    public static void main(String[] args) {

        // デジカメオブジェクトの宣言と生成
        DigitalCamera myCamera = new DigitalCamera();

        // デジカメにて撮影
        myCamera.takePicture("子猫");
        myCamera.takePicture("ランチ");
        myCamera.takePicture("カプチーノ");
        myCamera.takePicture("赤ちゃん");
        myCamera.takePicture("ツーショット");

        System.out.println();

        // 撮影画像数の確認
        System.out.println("現在の撮影枚数:" + myCamera.getPictureCount());

        System.out.println();

        // 画像の閲覧
        myCamera.showPictures();

        System.out.println();

        // 画像ファイルのクリア
        myCamera.clearMemory();

        System.out.println();

        // 撮影画像数の再確認
        System.out.println("現在の撮影枚数:" + myCamera.getPictureCount());

    }
}


// ここにデジカメクラスを作成してください


// ここに画像クラスを作成してください


解答例


TOPに戻る


問題3-4

人工の多い都道府県ベスト10を当てるクイズを作成しましょう。
(2021年4月1日現在のデータ)


HashMap<String, Integer>型のマップには、キーに都道府県名、値に順位を格納します。
次のランキング情報を登録してください。

 1位:東京都
 2位:神奈川県
 3位:大阪府
 4位:愛知県
 5位:埼玉県
 6位:千葉県
 7位:兵庫県
 8位:北海道
 9位:福岡県
10位:静岡県


都道府県名の入力受付を行い、その都道府県がランキングに入っていた場合は「正解!」「○○は△位です」と表示して、その都道府県をランキングMapオブジェクトから削除してください。
その都道府県がランキングに入っていなかった場合は「残念・・・」「○○はランキングに入っていません・・・」「ゲームオーバー」と表示して終了します。


ベスト10のすべての都道府県を答えられた場合は、「おめでとうございます!」「ベスト10をすべて答えました!」と表示してゲームを終了します。


【実行結果】

人口の多い都道府県ベスト10を当ててください!
東京都
正解!
東京都は1位です
北海道
正解!
北海道は8位です
沖縄県
残念・・・
沖縄県はランキングに入っていません・・・
ゲームオーバー


【HashMapBasicPractice.java】

public class HashMapBasicPractice {
    public static void main(String[] args) {

        System.out.println("人口の多い都道府県ベスト10を当ててください!");

        // 入力値変数の宣言
        String input;

        // 入力の受付
        input = System.console().readLine();

    }
}


解答例


TOPに戻る


問題3-5

宝物を表現するTreasureクラスと、金庫を表現するStrongBoxクラス、秘密の言葉に関する例外を表現するIllegalSecretException例外クラスとDuplicateSecretException例外クラスを作成してください。


その4つのクラスを使用するHashMapNormalPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)


【Treasureクラス】

  1. 宝物のタイプを表現するtypeインスタンスフィールド(String型)を定義します。

  2. タイプの値を受け取るコンストラクタを定義します。
    タイプの値をインスタンスフィールドに設定します。

  3. オブジェクトの文字列表現を返すためのtoStringメソッドをオーバーライドします。
    戻り値として返す値は、typeインスタンスフィールドの値そのものです。


【IllegalSecretException例外クラスとDuplicateSecretException例外クラス】

  1. 検査例外なのでExceptionクラスを継承します。

  2. クラスの中は空っぽで良いです。


【StrongBoxクラス】

  1. HashMap<String, Treasure>型の宝物保持HashMapインスタンスフィールドtreasureを定義します。
    キーのString型は、秘密の言葉を表現します。

  2. 引数なしコンストラクタを定義します。
    宝物保持HashMapインスタンスフィールドtreasuresのオブジェクトをここで生成してください。

  3. 秘密の言葉と宝物を金庫に格納するstoreメソッドを定義します。
    第一引数は秘密の言葉(String型)、第二引数は宝物オブジェクト(Treasure型)です。
    戻り値はなしです。
    検査例外DuplicateSecretExceptionをスローする可能性があるので、throwsが必要です。
    まず、引数で渡ってきた秘密の言葉がすでに使用されているかをチェックします。
    すでに使用されている場合は、DuplicateSecretExceptionのインスタンスを生成し、スローします。
    秘密の言葉がまだ使用されていない場合は、「○○を金庫に格納しました!」と出力し、HashMapインスタンスフィールドtreasuresに秘密の言葉をキーとして宝物オブジェクトを格納してください。

  4. 秘密の言葉に対する宝物オブジェクトを取得するgetTreasureメソッドを定義します。
    引数は秘密の言葉(String型)、戻り値は宝物オブジェクト(Treasure型)です。
    検査例外IllegalSecretExceptionをスローする可能性があるので、throwsが必要です。
    HashMapインスタンスフィールドtreasureから、秘密の言葉を元に宝物オブジェクトを取得し、戻り値として返します。
    もし秘密の言葉が不正の場合は、HashMapオブジェクトはnullを返すので、その場合はIllegalSecretExceptionのインスタンスを生成し、スローします。


【実行結果】

ダイヤの指輪を金庫に格納しました!
真珠のネックレスを金庫に格納しました!
金のブレスレットを金庫に格納しました!
秘密の言葉「xrt03」はすでに使われています

ダイヤの指輪をゲットしました!
真珠のネックレスをゲットしました!
秘密の言葉「xrr03」は不正です


【HashMapNormalPractice.java】

public class HashMapNormalPractice {
    public static void main(String[] args) {

        // 金庫インスタンスの作成
        StrongBox guard = new StrongBox();

        // 秘密の言葉変数の宣言
        String secret = null;

        try {
            // 1つ目の宝物を格納
            secret = "sgf01";
            guard.store(secret, new Treasure("ダイヤの指輪"));

            // 2つ目の宝物を格納
            secret = "zkq02";
            guard.store(secret, new Treasure("真珠のネックレス"));

            // 3つ目の宝物を格納
            secret = "xrt03";
            guard.store(secret, new Treasure("金のブレスレット"));

            // 4つ目の宝物を格納(秘密の言葉が重複)
            secret = "xrt03";
            guard.store(secret, new Treasure("プラチナのイヤリング"));

        } catch(DuplicateSecretException e) {
            System.out.println("秘密の言葉「" + secret + "」はすでにつかわれています");
        }

        System.out.println();

        try {
            // 1つ目の宝物を取得
            secret = "sgf01";
            Treasure treasure1 = guard.getTreasure(secret);
            System.out.println(treasure1 + "をゲットしました!");

            // 2つ目の宝物を取得
            secret = "zkq02";
            Treasure treasure2 = guard.getTreasure(secret);
            System.out.println(treasure2 + "をゲットしました!");

            // 3つ目の宝物を取得(秘密の言葉が不正)
            secret = "xrr03";
            Treasure treasure3 = guard.getTreasure(secret);
            System.out.println(treasure3 + "をゲットしました!");

        } catch(IllegalSecretException e) {
            System.out.println("秘密の言葉「" + secret + "」は不正です");
        }

    }
}


// ここに宝物クラスを作成してください


// ここに秘密の言葉不正例外クラスを作成してください


// ここに秘密の言葉重複例外クラスを作成してください


// ここに金庫クラスを作成してください


解答例


TOPに戻る


問題3-6

あるグループに属するメンバーを表現するMemberクラスがあります。

フィールドとして、int型のidとString型のnameを持ち、基本的なコンストラクタを持ち、toStringメソッドをオーバーライドしているとても基本的なクラスです。


Memberクラスを使用するHashSetEqualsPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)


このプログラムを変更せずに、そのままコンパイル・実行すると次のように出力されます。


【正しくない実行結果(順不同)】

ID:3 NAME:村田
ID:1 NAME:ニセ山田
ID:5 NAME:川田
ID:1 NAME:山田
ID:2 NAME:高田
ID:4 NAME:吉田


メンバーを管理するためのグループを表現するHashSet型のgroup変数を作成しています。
このグループは、メンバーを管理するためにIDの値を使用し、同じIDの値を持つメンバーは加入できないようにしようと思っています。


しかし、先ほどの実行結果では、グループにIDが1の「ニセ山田」が加入できています。


Setコレクションは、本来等値のオブジェクトを登録できないように設計されています。
「同じIDの値を持つMemberオブジェクトは等値」となるように、Memberクラスを修正してください。


ヒントは、Objectクラスの持つメソッドを2つオーバーライドすることです。


【正しい実行結果(順不同)】

ID:1 NAME:山田
ID:2 NAME:高田
ID:3 NAME:村田
ID:4 NAME:吉田
ID:5 NAME:川田


【HashSetEqualsPractice.java】

import java.util.*;
public class HashSetEqualsPractice {
    public static void main(String[] args) {

        // グループを結成
        HashSet<Member> group = new HashSet<Member>();

        // メンバーを追加
        group.add(new Member(1, "山田"));
        group.add(new Member(2, "高田"));
        group.add(new Member(3, "村田"));
        group.add(new Member(4, "吉田"));
        group.add(new Member(5, "川田"));

        // 偽物がメンバーとして追加!
        group.add(new Member(1, "ニセ山田"));

        // メンバー紹介
        for(Member member : group) {
            System.out.println(member);
        }

    }
}


// メンバークラスは不完全です
class Member {

    private int id;        // ID
    private String name;         // 名前

    // コンストラクタ
    public Member(final int id, final String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "ID:" + id + " NAME:" + name;
    }

}


解答例


TOPに戻る


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work