条件分岐(Java)
条件分岐
はじめに
ここでは、プログラムの基本制御のひとつである。条件分岐と条件式について、例を作りながら説明します。if文
if文の構文は以下です。if(条件式1){
命令群1
}else if(条件式1){
命令群2
}else{
命令群3
}
比較演算子を用いた「条件式」は以下のように書きます。
条件式 | 意味 |
a == b (=は2つつなげる) | aとbが等しいときにtrue、以外はfalseを返す。 |
a != b | aとbが等しくないときにtrue、以外はfalseを返す。 |
a < b | bがaより大きいときにtrue、以外はfalseを返す。 |
a <= b | bがa以上のときにtrue、以外はfalseを返す。 |
a > b | aがbより大きいときにtrue、以外はfalseを返す。 |
a >= b | aがb以上のときにtrue、以外はfalseを返す。 |
a instanceof b | aがb(クラス)のインスタンスであるときtrue、以外はfalseを返す。 |
「意味」の欄に「true|falseを返す」とあるように、条件式の変わりに真偽式(Booleanを戻り値とする式)を使用することもできます。また、これらの条件式を連結する論理演算子は以下のようになっています。
演算子 | 意味 |
&& | AND |
||(実際は半角) | OR |
NOT |
---|
まずは、ためしに例題をやってみましょう。test.basicパッケージにSample015というjavaアプリケーションのスタブを作成し、以下のようなコードをいれてみてください。(いっけん)不思議な結果が得られると思います。
package test.basic;
import test.basic.bean.Actor;
public class Sample015 {
public static void main(String[] args) {
// 基本型
int i1=1;
int i2=1;
double d1=1.001;
double d2=1.001;
boolean b1=true;
boolean b2=true;
if(i1==i2){
System.out.println("i1とi2は等しい");
}else{
System.out.println("i1とi2は等しくない");
}
if(d1==d2){
System.out.println("d1とd2は等しい");
}else{
System.out.println("d1とd2は等しくない");
}
if(b1==b2){
System.out.println("b1とb2は等しい");
}else{
System.out.println("b1とb2は等しくない");
}
// String クラス型(参照型)
String s1 = new String("たまごっち");
String s2 = new String("たまごっち");
String s3 = "たまごっち";
if(s1==s2){
System.out.println("s1とs2は等しい");
}else{
System.out.println("s1とs2は等しくない");
}
if(s1=="たまごっち"){
System.out.println("s1と「たまごっち」は等しい");
}else{
System.out.println("s1とs「たまごっち」は等しくない");
}
if(s3=="たまごっち"){
System.out.println("s3と「たまごっち」は等しい");
}else{
System.out.println("s3とs「たまごっち」は等しくない");
}
// Actor クラス型(参照型)
Actor a1 = new Actor("宙返りする");
Actor a2 = new Actor("宙返りする");
if(a1==a2){
System.out.println("a1とa2は等しい");
}else{
System.out.println("a1とa2は等しくない");
}
}
}
以下のような結果がでましたか?
i1とi2は等しい
d1とd2は等しい
b1とb2は等しい
s1とs2は等しくない
s1とs「たまごっち」は等しくない
s3と「たまごっち」は等しい
a1とa2は等しくない
基本型については期待通りですが、クラス型(参照型)の結果は解釈に苦しむかもしれません。ですが、型のところでお話した「参照型の意味」を思い出すと、この現象は以下のように理解できます。
- s1、s2、”たまごっち”、a1、a2はそれぞれ独立したクラスである。
- s3には”たまごっち”の参照アドレスが渡されている。
- 比較演算子の「==」は、参照型の場合、参照先アドレスを比較している。
- したがって、s1、s2、”たまごっち”、a1、a2は「等しくない」と判断され、「s3==たまごっち」だけが等しいと判断された。
このようにクラス型(参照型)を比較演算子で比較する場合には、参照先アドレスの比較になってしまい(これを浅い(shallowな)比較といったりします)、思ったとおりの結果がでません。
それでは、翻って「クラス(インスタンス)が等しい」とはどういうことでしょうか? プロパティー値(メンバー変数値)が等しいというのが一番妥当そうではありますが、「なにを持って等しいとするか」は作成者が判断すべきではないでしょうか? つまり、a1とa2を比較する前に、「プロパティ値が等しいなら、2つのActorは等しい」と定義し、これを検査するメソッド(真偽式)を用意すべきでした。Stringにはequals()というメソッドがあり、それが中身まで比較した結果を真偽値で戻します(これをdeepな比較ということがあります)。
それでは、Stringと同様に、Actorにequals()メソッドを追加して見ましょう。test.basic.beanパッケージにあるActor.javaを開き、以下のように修正してください。
package test.basic.bean;
public class Actor {
private String action;
public Actor(){
this.action="宙返りをする";
}
public Actor(String str){
this.action=str;
}
public String getAction() {
return action;
}
public void setAction(String string) {
action = string;
}
public String action() {
return action;
}
// ここから追加する。
public boolean equals(Actor a){
if(a.getAction().equals(this.action)) return true;
return false;
}
// 追加終了。
}
次にSample015をコピーして、Sample016をつくり、以下のように修正してください。
package test.basic;
import test.basic.bean.Actor;
public class Sample016 {
public static void main(String[] args) {
// 基本型
int i1=1;
int i2=1;
double d1=1.001;
double d2=1.001;
boolean b1=true;
boolean b2=true;
if(i1==i2){
System.out.println("i1とi2は等しい");
}else{
System.out.println("i1とi2は等しくない");
}
if(d1==d2){
System.out.println("d1とd2は等しい");
}else{
System.out.println("d1とd2は等しくない");
}
if(b1==b2){
System.out.println("b1とb2は等しい");
}else{
System.out.println("b1とb2は等しくない");
}
// String クラス型(参照型)
String s1 = new String("たまごっち");
String s2 = new String("たまごっち");
String s3 = "たまごっち";
if(s1.equals(s2)){
System.out.println("s1とs2は等しい");
}else{
System.out.println("s1とs2は等しくない");
}
if(s1.equals("たまごっち")){
System.out.println("s1と「たまごっち」は等しい");
}else{
System.out.println("s1とs「たまごっち」は等しくない");
}
if(s3.equals("たまごっち")){
System.out.println("s3と「たまごっち」は等しい");
}else{
System.out.println("s3とs「たまごっち」は等しくない");
}
// Actor クラス型(参照型)
Actor a1 = new Actor("宙返りする");
Actor a2 = new Actor("宙返りする");
if(a1.equals(a2)){
System.out.println("a1とa2は等しい");
}else{
System.out.println("a1とa2は等しくない");
}
}
}
それでは、これを実行してみてください。以下のような結果ででましたか?
i1とi2は等しい
d1とd2は等しい
b1とb2は等しい
s1とs2は等しい
s1と「たまごっち」は等しい
s3と「たまごっち」は等しい
a1とa2は等しい
これで一件落着です。
switch文
次は、switch文について軽く触れておきましょう。switch文の構文は以下です。switch(評価式){
case 値1:
評価式が値1をとるときに実行する命令群
case 値2:
評価式が値2をとるときに実行する命令群
case 値3:
評価式が値3をとるときに実行する命令群
default :
評価式が値1〜3をとらなかったときに実行する命令群
}
(注)1.4系まで、評価式のデータ型は char、byte、short、intのみが許されていましたが、Java5より列挙型Enumが使用できるようになりました。
よくありがちなサンプルを例に実験してみましょう。Sample017を作成しましょう。
package test.basic;
import java.util.StringTokenizer;
public class Sample017 {
public static void main(String[] args) {
String str = "a,b,c,d,e";
StringBuffer sb = new StringBuffer();
sb.append(str);
sb.append("から(カンマ)をデリミッターにして値をとりだします。結果は");
StringTokenizer item = new StringTokenizer(str,",");
for (int index = 0; item.hasMoreTokens(); index++) {
switch (index) {
case 0:
sb.append(item.nextToken());
case 1:
sb.append(item.nextToken());
case 2:
sb.append(item.nextToken());
case 3:
sb.append(item.nextToken());
case 4:
sb.append(item.nextToken());
}
}
System.out.println(sb.toString());
}
}
これを実行してみてください。以下のような結果がでましたか?
a,b,c,d,eから(カンマ)をデリミッターにして値をとりだします。結果はabcde
これは、csvからデータを取り出す際によくやる方法です。
2007年03月02日(金) 15:56:05 Modified by wanderingse