未来エンジニア養成所Blog

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

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

title


問題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();


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


    }
}


解答例

【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();

        // 見つかったことを判定するフラグ変数
        boolean flag = false;

        // 入力英単語の存在チェック
        for(int i = 0; i < number.size(); i++) {

            // 文字列の等値チェック
            if(number.get(i).equals(input)) {
                System.out.println(input + "は数値の" + i + "です");
                flag = true;
                break;
            }
        }

        // 入力英単語が不正の場合
        if(!flag) {
            System.out.println(input + "は英単語として存在しません");
        }
    }
}


解説

Javaには、同じ型のデータをまとめて扱う仕組みとして「配列」があります。

しかし、Javaの配列はいわゆる「固定長配列」と言われるもので、要素数を後から増減できないので、非常に不便です。


ですので、現場レベルでは意外と配列は使われず、今回の問題のテーマであるコレクションフレームワークがよく使われます。


「コレクションフレームワーク」というとなんだか凄そうですが、簡単に言うと便利なクラスです。

List、Set、Map、Queueという大きな分類がありますが、一番一般的なのはListコレクション、その中でもArrayListクラスです。

配列のようにインデックスで要素を管理しますが、要素を後から追加したり削除することが可能です。



ArrayListクラスを利用するには、もちろん最初にインスタンス化します。

その際に、大きなポイントがあります。

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


ArrayListクラスをnewキーワードでインスタンス化すると、それはもちろんArrayList型のオブジェクトです。

しかし、ArrayListオブジェクトはある型のオブジェクトをまとめて管理するためのものなので、第二の型が必要になります。

それを、<>で囲って記述しています。

これを「ジェネリックス」といいます。


今回の例だと、「ArrayListはString型のオブジェクトをまとめて管理するためのArrayList型のオブジェクトを生成していることになります。


ちなみに「ジェネリックス」はJDK5.0で導入された画期的な仕組みです。



インスタンス化したばかりのArrayListオブジェクトの要素は0個です。

ですので、addメソッドを使って要素を追加していきます。

そして最初に追加した要素はインデックス番号が0、次の要素が1、・・・、というようになります。


今回の問題のポイントは「zero」が0、「one」が1というように、英単語とインデックス番号が関連付いていることです。



ArrayListオブジェクトが管理している要素数を取得するには、sizeメソッドを呼び出します。

配列で言えばlength属性と同じです。

sizeメソッドを使えば、次のようにArrayListオブジェクトを走査することが可能です。

// 入力英単語の存在チェック
for(int i = 0; i < number.size(); i++) {
    ...
}


ArrayListオブジェクトの走査には、配列と同じく拡張for文が使えます。

しかし、今回はインデックス番号を後から使用するので通常のfor文で記述しています。



ArrayListオブジェクトから要素を取り出すには、getメソッドを使用します。

引数にはインデックス番号を指定します。

戻り値の型は、ジェネリックスで指定した型になります。


今回は文字列の等値チェックですから、もちろん==による比較演算子ではなくequalsメソッドを使用します。

// 文字列の等値チェック
if(number.get(i).equals(input)) {
    System.out.println(input + "は数値の" + i + "です");
    flag = trure;
    break;
}


今回は見つかった判断用にboolean型変数を宣言してみました。

以下のようにboolean型変数を用いずにreturn文で終了させても良いです。

// 入力英単語の存在チェック
for(int i = 0; i < number.size(); i++) {
    // 文字列の等値チェック
    if(number.get(i).equals(input)) {
        System.out.println(input + "は数値の" + i + "です");
        return;
    }
}

// 入力英単語が不正の場合
System.out.println(input + "は英単語として存在しません");



Eclipseを使用している場合の補足

今回の解答例をEclipseで実行しようとすると、System.console()の返却値がnullになり動作せず、Null Pointer Exceptionが発生します。

Eclipse内のコンソールで今回のようなプログラムを動作させたい場合、System.console()を使わずに、System.input()をBufferedReader等でくるんだインスタンスを代用すると良いでしょう。

これでEclipseのコンソールで入力した内容が、行単位でプログラムに渡せるようになります。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();


参考図書



LINE公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加