オブジェクト指向練習問題。has-a,例外処理。

Q1
傘クラスと傘立てクラス、アプリケーションクラスをつくり。
各操作ができるプログラムを作成せよ。

■クラス:Umbrella
<フィールド変数>
private String color;
private int size;

<一般メソッド>
public toString()

■クラス:UmbrellaStand
<フィールド変数>
private Umbrella umbrella;

<一般メソッド>
public void putUmbrella(Umbrella u)
…引数でもらった傘を傘立てにたてる
public Umbrella takeUmbrella()
…傘を取り出してその傘を返す
public boolean hasUmbrella()
…現在傘がセットされているかをboolで返す
public Umbrella getUmbrella()
…getter
public String toString()

■アプリケーションクラス:UmbrellaApp
傘と傘立てをそれぞれ5個ずつインスタンス化して処理を行う。
ユーザーからの入力を受け取る際には例外処理を入れて、不正な値の場合は再入力させること。
詳しくは実行例を参照のこと。

[実行例]

5個の傘立てに傘を収納してください。
***傘立て***
0---空
1---空
2---空
3---空
4---空
傘立ての番号を選んでください>5
err:[0~4の整数を入力してください]
傘立ての番号を選んでください>三
err:[0~4の整数を入力してください]
傘立ての番号を選んでください>3
どの傘を入れますか?
0---色:赤, 長さ:60
1---色:橙, 長さ:65
2---色:黄, 長さ:60
3---色:緑, 長さ:70
4---色:青, 長さ:60
傘の番号を選んでください>4
色:青, 長さ:60
の傘が立てられました。
***傘立て***
0---空
1---空
2---空
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>0
どの傘を入れますか?
0---色:赤, 長さ:60
1---色:橙, 長さ:65
2---色:黄, 長さ:60
3---色:緑, 長さ:70
傘の番号を選んでください>3
色:緑, 長さ:70
の傘が立てられました。
***傘立て***
0---色:緑, 長さ:70
1---空
2---空
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>1
どの傘を入れますか?
0---色:赤, 長さ:60
1---色:橙, 長さ:65
2---色:黄, 長さ:60
傘の番号を選んでください>0
色:赤, 長さ:60
の傘が立てられました。
***傘立て***
0---色:緑, 長さ:70
1---色:赤, 長さ:60
2---空
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>1
色:赤, 長さ:60
の傘が入っています。
取り出しますか?1.Yes 2.No>1
色:赤, 長さ:60
の傘が取り出されました。
***傘立て***
0---色:緑, 長さ:70
1---空
2---空
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>2
どの傘を入れますか?
0---色:橙, 長さ:65
1---色:黄, 長さ:60
2---色:赤, 長さ:60
傘の番号を選んでください>2
色:赤, 長さ:60
の傘が立てられました。
***傘立て***
0---色:緑, 長さ:70
1---空
2---色:赤, 長さ:60
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>1
どの傘を入れますか?
0---色:橙, 長さ:65
1---色:黄, 長さ:60
傘の番号を選んでください>1
色:黄, 長さ:60
の傘が立てられました。
***傘立て***
0---色:緑, 長さ:70
1---色:黄, 長さ:60
2---色:赤, 長さ:60
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>3
色:青, 長さ:60
の傘が入っています。
取り出しますか?1.Yes 2.No>2
***傘立て***
0---色:緑, 長さ:70
1---色:黄, 長さ:60
2---色:赤, 長さ:60
3---色:青, 長さ:60
4---空
傘立ての番号を選んでください>4
どの傘を入れますか?
0---色:橙, 長さ:65
傘の番号を選んでください>0
色:橙, 長さ:65
の傘が立てられました。
***傘立て***
0---色:緑, 長さ:70
1---色:黄, 長さ:60
2---色:赤, 長さ:60
3---色:青, 長さ:60
4---色:橙, 長さ:65
収納が終わりました。アプリケーションを終了します。

一般クラス

public class Umbrella {
	private String color;
	private int size;
	public Umbrella(String color, int size) {
		this.color = color;
		this.size = size;
	}
	@Override
	public String toString() {
		return String.format("色:%s, 長さ:%d", this.color, this.size);
	}
}
class UmbrellaStand {
	private Umbrella umbrella;
	public void putUmbrella(Umbrella u) {
		this.umbrella = u;
		System.out.println(u);
		System.out.println("の傘が立てられました。");
	}
	public Umbrella takeUmbrella() {
		Umbrella retUmbrella = this.umbrella;
		System.out.println(this.umbrella);
		System.out.println("の傘が取り出されました。");
		this.umbrella = null;
		return retUmbrella;
	}
	public boolean hasUmbrella() {
		return this.umbrella != null;
	}
	public Umbrella getUmbrella() {
		return this.umbrella;
	}
	@Override
	public String toString() {
		return hasUmbrella() ? this.umbrella.toString() : "空";
	}
}

アプリケーションクラス

import java.util.*;
public class UmbrellaApp {
	private static List<Umbrella> u_list = new ArrayList<>();
	private static List<UmbrellaStand> s_list = new ArrayList<>();
	private static Scanner s = new Scanner(System.in);
	public static void main(String[] args) {
		init();
		System.out.println(s_list.size() + "個の傘立てに傘を収納してください。");
		while (true) {
			displayUmbrellaStand();
			int index = getInputRange("傘立ての番号を選んでください>", 0, s_list.size() - 1);
			UmbrellaStand us = s_list.get(index);
			if (us.hasUmbrella()) {
				System.out.println(us.getUmbrella());
				System.out.println("の傘が入っています。");
				int select = getInputRange("取り出しますか?1.Yes 2.No>", 1, 2);
				if (select == 1) {
					u_list.add(us.takeUmbrella());
				}
			} else {
				System.out.println("どの傘を入れますか?");
				displayUmbrella();
				int u_index = getInputRange("傘の番号を選んでください>", 0, u_list.size() - 1);
				us.putUmbrella(u_list.get(u_index));
				u_list.remove(u_index);
				if (u_list.size() == 0) {
					displayUmbrellaStand();
					System.out.println("収納が終わりました。アプリケーションを終了します。");
					return;
				}
			}
		}
	}
	public static void init() {
		// 傘作成
		u_list.add(new Umbrella("赤", 60));
		u_list.add(new Umbrella("橙", 65));
		u_list.add(new Umbrella("黄", 60));
		u_list.add(new Umbrella("緑", 70));
		u_list.add(new Umbrella("青", 60));
		// 傘立て作成
		for (int i = 0; i < 5; i++) {
			s_list.add(new UmbrellaStand());
		}
	}
	public static void displayUmbrellaStand() {
		System.out.println("***傘立て***");
		for (int i = 0; i < s_list.size(); i++) {
			System.out.println(i + "---" + s_list.get(i));
		}
	}
	public static void displayUmbrella() {
		for (int i = 0; i < u_list.size(); i++) {
			System.out.println(i + "---" + u_list.get(i));
		}
	}
	static int getInputRange(String msg, int min, int max) {
		int n;
		while (true) {
			// scannerは例外を発生した際値を保持し続けるのでループの頭でnewする。
			s = new Scanner(System.in);
			System.out.print(msg);
			try {
				n = s.nextInt();// nextIntは整数以外だとInputMismatchExceptionを投げる
				if (n < min || n > max) {
					// この場合も例外を投げる
					throw new InputMismatchException();
				}
				// 適正な値が入ったらループを抜ける
				break;
			} catch (InputMismatchException e) {
				System.out.printf("err:[%d~%dの整数を入力してください]\n", min, max);
			}
		}
		return n;
	}
}