一度に多数の分岐をさせたい時には「SWITCH文」が使用できます.
「SWITCH文」は一般に次のような構造をしています.
switch(評価式){
case 定数式1 : 文1
case 定数式2 : 文2
…
…
…
case 定数式n : 文n
default : 文n+1
}
「評価式」と「定数式」は「byte型,short型,int型,char型」または「String」が値に成るように設定します.こうすると,「評価式」と同じ値を取る「case」以降の「文」が全て実 行されます.「default」には全ての「case」にあてはまらない場合の処理を書きます.
「SWITCH文」だけでは「評価式」と一致した「case」以降の全ての「文」が実行されてしまいますが,一致した「case」の「文」だけが実 行されるようにすることができます.
switch(評価式){
case 定数式1 : 文1
break;
case 定数式2 : 文2
break;
…
…
…
case 定数式n : 文n
break;
default : 文n+1
}
上記のように各caseの最後に「break文」を入れると,「評価式」と一致した「case」の「文」が実行されると「break文」によって 「switch文」全体を終了します.
入力した値に応じて表示が変わるプログラムを作ってみましょう.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
public class FirstSW extends Application{
public static void main(String[] args) {
launch(args);
}
TextField tf1 = new TextField();
TextField tf2 = new TextField();
Label label1 = new Label("整数を半角で入力して下さい");
Label label2 = new Label("月を日本語で入力して下さい(1月etc.)");
Label label3 = new Label();
Label label4 =new Label();
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Application FirstSW");
//root Node を作成
VBox root = new VBox();
//root の設定
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10,10,10,10));
root.setSpacing(10.0);
//pane1 を作成
HBox pane1 = new HBox();
//pane1 の設定
pane1.setAlignment(Pos.CENTER_LEFT);
pane1.setPadding(new Insets(10,10,10,10));
pane1.setSpacing(5.0);
//paine2 の作成
HBox pane2 = new HBox();
//pane2 の設定
pane2.setAlignment(Pos.CENTER_LEFT);
pane2.setPadding(new Insets(10,10,10,10));
pane2.setSpacing(5.0);
//テキストフィールドの設定
tf1.setAlignment(Pos.CENTER_RIGHT);
tf1.setMaxWidth(50);
tf2.setAlignment(Pos.CENTER_RIGHT);
tf2.setMaxWidth(50);
//pane1, pane2 にラベルとテキストフィールドを組み込む
pane1.getChildren().addAll(label1,tf1);
pane2.getChildren().addAll(label2,tf2);
//イベント処理
tf1.setOnAction(event -> updateText());
tf2.setOnAction(event -> updateText());
//root に pane1, pane2 を組み込む
root.getChildren().addAll(pane1,label3,pane2,label4);
//Scene の作成
Scene scene = new Scene(root,400,200);
//Scene を Stage に組み込む
stage.setScene(scene);
//Stageの表示
stage.show();
}
//updateTextメソッドの定義
private void updateText() {
String s = tf1.getText();
int n = Integer.parseInt(s);
String month = tf2.getText();
//switch文1(評価式が整数値)
switch(n%4){
case 0: label3.setText("あなたは0の仲間を入力しました.");
break;
case 1: label3.setText("あなたは1の仲間を入力しました.");
break;
case 2: label3.setText("あなたは2の仲間を入力しました.");
break;
case 3: label3.setText("あなたは3の仲間を入力しました.");
break;
default: label3.setText("整数を入力して下さい.");
}
//switch文2(評価式が文字列)
switch(month){
case "1月": label4.setText("睦月(むつき)");
break;
case "2月": label4.setText("如月(きさらぎ)");
break;
case "3月": label4.setText("弥生(やよい)");
break;
case "4月": label4.setText("卯月(うづき)");
break;
case "5月": label4.setText("皐月(さつき)");
break;
case "6月": label4.setText("水無月(みなつき)");
break;
case "7月": label4.setText("文月(ふみづき)");
break;
case "8月": label4.setText("葉月(はづき)");
break;
case "9月": label4.setText("長月(ながつき)");
break;
case "10月": label4.setText("神無月(かんなづき)");
break;
case "11月": label4.setText("霜月(しもつき)");
break;
case "12月": label4.setText("師走(しわす)");
break;
default: label4.setText("月を入力して下さい.");
}
}
}
上のプログラムを参考にして次のどちらかのプログラムを作成して実行してみましょう.
入力欄を3つ作り,それぞれに西暦の年月日を入力すると,その日の曜日が表示されるプログラムを作ってみる.クラス名は「Ex06_2」とする.
現在使用されている西暦は,1582年2月24日に発布されたグレゴリオ暦で,1582年10月15日を金曜日と定められている.これ以降の曜日は以下のツェラーの公式で計算できる.
\(y\)を年,\(m\)を月(ただし,1月と2月は前年の13月と14月とする,つまり2014年1月1日は2013年13月1日とする),\(d\)を日として, \[ h = \left( 5C + Y + \left[\frac{Y}{4}\right] + \left[\frac{C}{4}\right] + \left[\frac{26(m+1)}{10}\right] + d \right)\ {\rm mod}\ 7 \] ここで\(C = \left[\frac{y}{100}\right]\):\([x]\)は\(x\)以下の最大の整数を表す,\(Y = y\ {\rm mod}\ 100\):\(x\ {\rm mod}\ y\)は\(x\)を\(y\)で割った余りを表す.
この式の値 h が0,1,2,3,4,5,6のとき,それぞれ土曜,日曜,月曜,火曜,水曜,木曜,金曜となる.