ユーザーから任意の値を取得するのではなくプログラム側の提示したオプションから選択してもらうケースを想定します。よくあるケースとしてはユーザーの性別や住所の都道府県、職種やアンケートの趣味趣向などが考えられます。必要なサービスの選択をすることもあるでしょう。
ここでは文字列の配列として持っているオプションを標準出力に表示しユーザが標準入力を通して選択した値を返すプログラムを作ります。
標準入力から文字列を取得する
標準入力から文字列を取得するユーティリティを作る
標準入力からint型整数を取得するユーティリティを作る
標準入力からint型整数を範囲指定で取得するユーティリティを作る
標準入力からboolean値を取得するユーティリティを作る
仕様を決める
文字列にある配列を1行ずつ書き出すようにします。
好きなデザートを選択してください。 0:ドーナツ 1:チョコレートパフェ 2:チーズケーキ 3:パンケーキ 数字を入力してください。 >
ここで数字を入力するとそれに対応した文字列を取得できるようにします。またここで数字を取得するのは以前に作ったint型整数を範囲指定で取得するメソッドを再利用します。
標準入力からint型整数を範囲指定で取得するユーティリティを作る
メソッドのインタフェースと処理を決める
次にインタフェースを決めます。メソッド名、引数、戻り値をインタフェースと考えます。
- メソッド名はreadOption
- 引数は入力を促すメッセージとオプションの文字列配列
- 戻り値は選択されたオプションの文字列
処理の流れは以下の通りです。
- 引数から受け取ったメッセージを出力する。
- オプションを1行ずつ順番に表示する。頭に行番号を付ける。
- readIntメソッドを呼び出し数字を取得する。
- 数字に対応した文字列をオプションの文字列配列から取得し返す。
数字の取得はすでに作られたメソッドで確実に取得できるので今回は想定外の入力は起こりません。このためループで何度も入力を促すような処理は不要です。
/**
* 標準入力からオプション選択を取得する
* @param message
* @param options
* @return
*/
public String readOption(String message, String[] options){
//メッセージを出力
out.println(message);
for(int i = 0;i < options.length;i++){
out.println(i + ":" + options[i]);
}
int index = readInt("数字を入力してください。", 0, options.length - 1);
return options[index];
}
これを実行するmainメソッドも記述します。
public static void main(String[] args){
TerminalUtil terminalUtil = new TerminalUtil();
String[] options = new String[]{"ドーナツ", "チョコレートパフェ", "チーズケーキ", "パンケーキ"};
String dessert = terminalUtil.readOption("デザートをお選び下さい。", options);
System.out.println("ご注文は" + dessert + "ですね。");
}
以下実行結果です。何度か間違えた入力をしていますが結果的には正しい入力がされるように誘導されています。
デザートをお選び下さい。 0:ドーナツ 1:チョコレートパフェ 2:チーズケーキ 3:パンケーキ 数字を入力してください。> 数字ではありません。 数字を入力してください。>9 0以上3以下の数字にしてください。 数字を入力してください。>0 ご注文はドーナツですね。
今回のポイントはすでに作ったメソッドを再利用することによりより複雑な処理を簡単に実現できることにあります。