比較演算と文字列の比較

目次
  • 解説
  • 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 == BAがBと等しければ true
イコールと読む
!=A != BAがBと等しくなければ true
ノットイコールと読む
>A > BAがBを超過していれば true
大なりと読む
<A < BAがB未満であれば true
小なりと読む
>=A >= BAがB以上であれば true
大なりイコールと読む
<=A <= BAが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

結果をよく見ると、soldTicketsCount121になり得ないならば、「==」と「>=」で正しい表示となり、soldTicketsCount121になり得るならば「>=」のみが正しい表示となることがわかります。

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

この中でコメントが示す比較演算式の表記として正しくないものはどれか?