比較演算と文字列の比較
- 解説
- 1. 学習の準備
- 2. 条件式と比較演算式
- 3. 比較演算子
- 4. 文字列の比較
解説
1. 学習の準備
下表のとおり学習用のクラスを作成して、その中にmainメソッドを作っておきましょう。
ファイル名 | Condition.java |
パッケージ名(格納フォルダー) | net.digskill |
クラス名 | Condition |
2. 条件式と比較演算式
Javaにおける式(しき)のひとつである条件式は、「基本構文 > 型・変数・定数 > 型 > 正しい?正しくない?」で学習した通り、「もし~ならば」という条件文の「~」の部分を比較によって示した式のことでした。
改めて「映画のチケットを販売するシステム」を例にとって考えてみましょう。「もし満席ならば売り切れと表示する」という条件文に対し、「満席」という部分を言い換えると、「販売済みチケット数と座席数が同じ」となります。これを条件式にすると、以下のコードの5行目の右辺となるのでしたね。
static void practiceBoolean() {
int theatreSheetsCount = 120;
int soldTicketsCount = 119;
// 販売済みチケット数と座席数を「==」で比較する式の結果を代入
boolean isSoldOut = (soldTicketsCount == theatreSheetsCount);
if (isSoldOut) {
Logger.out("売り切れです!");
} else {
Logger.out("販売中です!");
}
}
この条件式の核となる比較を行う部分「soldTicketsCount == theatreSheetsCount」のことを比較演算式と呼びます。このケースでは、条件式は比較演算式1つのみで構成されています。
なお、比較演算式の結果を出すことを評価するといい、評価の結果は必ず論理値型(boolean型)の「true」か「false」となります。
3. 比較演算子
比較演算式の中で「同じかどうか」を示す「==」のことを比較演算子と言い、下表のような種類があります。
比較演算子 | 用例 | 比較結果 |
---|---|---|
== | A == B | AがBと等しければ true イコールと読む |
!= | A != B | AがBと等しくなければ true ノットイコールと読む |
> | A > B | AがBを超過していれば true 大なりと読む |
< | A < B | AがB未満であれば true 小なりと読む |
>= | A >= B | AがB以上であれば true 大なりイコールと読む |
<= | A <= B | AがB以下であれば true 小なりイコールと読む |
以下・以上は、AとBが等しい場合も true となりますが、超過・未満の場合はAとBが等しい場合には true となりませんので、次のサンプルコードを確認して、正しく使い分けられるようにしましょう。
static void practiceCompare() {
int theatreSheetsCount = 120;
int soldTicketsCount = 119;
Logger.out("soldTicketsCount:" + soldTicketsCount);
checkSoldOut(soldTicketsCount == theatreSheetsCount);
checkSoldOut(soldTicketsCount != theatreSheetsCount);
checkSoldOut(soldTicketsCount > theatreSheetsCount);
checkSoldOut(soldTicketsCount < theatreSheetsCount);
checkSoldOut(soldTicketsCount >= theatreSheetsCount);
checkSoldOut(soldTicketsCount <= theatreSheetsCount);
soldTicketsCount = 120;
Logger.out("soldTicketsCount:" + soldTicketsCount);
checkSoldOut(soldTicketsCount == theatreSheetsCount);
checkSoldOut(soldTicketsCount != theatreSheetsCount);
checkSoldOut(soldTicketsCount > theatreSheetsCount);
checkSoldOut(soldTicketsCount < theatreSheetsCount);
checkSoldOut(soldTicketsCount >= theatreSheetsCount);
checkSoldOut(soldTicketsCount <= theatreSheetsCount);
soldTicketsCount = 121;
Logger.out("soldTicketsCount:" + soldTicketsCount);
checkSoldOut(soldTicketsCount == theatreSheetsCount);
checkSoldOut(soldTicketsCount != theatreSheetsCount);
checkSoldOut(soldTicketsCount > theatreSheetsCount);
checkSoldOut(soldTicketsCount < theatreSheetsCount);
checkSoldOut(soldTicketsCount >= theatreSheetsCount);
checkSoldOut(soldTicketsCount <= theatreSheetsCount);
}
static void checkSoldOut(boolean isSoldOut) {
if (isSoldOut) {
Logger.out("売り切れです!");
} else {
Logger.out("販売中です!");
}
}
[2020/12/31 12:34:56.789] soldTicketsCount:119
[2020/12/31 12:34:56.789] 販売中です! // 119 == 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 119 != 120 ⇒ true
[2020/12/31 12:34:56.789] 販売中です! // 119 > 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 119 < 120 ⇒ true
[2020/12/31 12:34:56.789] 販売中です! // 119 >= 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 119 <= 120 ⇒ true
[2020/12/31 12:34:56.789] soldTicketsCount:120
[2020/12/31 12:34:56.789] 売り切れです! // 120 == 120 ⇒ true
[2020/12/31 12:34:56.789] 販売中です! // 120 != 120 ⇒ false
[2020/12/31 12:34:56.789] 販売中です! // 120 > 120 ⇒ false
[2020/12/31 12:34:56.789] 販売中です! // 120 < 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 120 >= 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 120 <= 120 ⇒ false
[2020/12/31 12:34:56.789] soldTicketsCount:121
[2020/12/31 12:34:56.789] 販売中です! // 121 == 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 121 != 120 ⇒ true
[2020/12/31 12:34:56.789] 売り切れです! // 121 > 120 ⇒ true
[2020/12/31 12:34:56.789] 販売中です! // 121 < 120 ⇒ false
[2020/12/31 12:34:56.789] 売り切れです! // 121 >= 120 ⇒ true
[2020/12/31 12:34:56.789] 販売中です! // 121 <= 120 ⇒ false
結果をよく見ると、soldTicketsCountが121になり得ないならば、「==」と「>=」で正しい表示となり、soldTicketsCountが121になり得るならば「>=」のみが正しい表示となることがわかります。
4. 文字列の比較
実は、比較演算子によって正しく(直感的な)比較ができるのは、内部にデータだけを持つ基本型だけです。
例えば、int型の変数には数値のみが入っているため、比較演算式でも数値どうしの比較が行われます。しかし、String型の変数には文字列が入っているのではなく、「データやメソッドなどを入れた入れ物の、コンピューター(メモリー)上の場所を示す情報」が入っているため、単純に比較しても「同じ文字列かどうか」という比較とならないのです。
そのため、文字列型の比較には「equals()」メソッドを使うと覚えておきましょう。
次のサンプルコードでは、「あいうえお」が入っているString型の変数どうしを比較していますが、「==」による比較ではAとCのパターン以外はすべてfalseになっています。
static void practiceEquals() {
String stringA = "あいうえお";
String stringB = new String("あいうえお");
String stringC = "あい" + "うえお";
String stringD = "あい".concat("うえお");
Logger.out(stringA); // あいうえお
Logger.out(stringB); // あいうえお
Logger.out(stringC); // あいうえお
Logger.out(stringD); // あいうえお
Logger.out(stringA == stringB); // false
Logger.out(stringA == stringC); // true (AとCは同じ場所にある)
Logger.out(stringA == stringD); // false
Logger.out(stringB == stringC); // false
Logger.out(stringB == stringD); // false
Logger.out(stringC == stringD); // false
Logger.out(stringA.equals(stringB)); // true
Logger.out(stringA.equals(stringC)); // true
Logger.out(stringA.equals(stringD)); // true
Logger.out(stringB.equals(stringC)); // true
Logger.out(stringB.equals(stringD)); // true
Logger.out(stringC.equals(stringD)); // true
}
このように、参照型では作り方によって、実体(ここでは「あいうえお」)を置いてある場所が変わってしまうため、「equals()」メソッドにより実際のデータどうしを比較させる必要があるのです。
問題
確認問題
確認問題1
この中でコメントが示す比較演算式の表記として正しくないものはどれか?