オーダーメイドコース
icon
icon

分かりやすく解説!JavaでcompareToを使う方法【初心者向け】

初心者向けにJavaでcompareToの使い方について解説しています。compareToメソッドは文字列を比較する際に利用します。書き方も細かく記載しているので、実際にプログラムを書いて理解していきましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

今回は、compareToメソッドの使い方について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

compareToメソッドとは、文字を比較することができるメソッドです。

compareToメソッドの使い方を知っておくことで、英数文字列だけでなく、ひらがなや、カタカナの比較も可能になります。

実務でも、compareToメソッドを利用した文字列比較処理を行います。

また、同じように文字列の比較をするメソッドである、equalsメソッドとの違いについても解説しています。

目次

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。

 

田島悠介

今回はcompareToを使ってみよう。

大石ゆかり

田島メンター!compareToは何をするんですか〜?

田島悠介

これは文字列を辞書式によって比較するんだ。詳しく見ていこう。

大石ゆかり

分かりました!

compareTo文について

compareTo文は文字列を比較するメソッドです。

メソッドとは、ふるまいとも呼ばれ、よく使う機能をあらかじめ用意しておき、compareTo( )と呼び出すことで、簡単に利用できる命令文のことです。

compareToメソッドは文字列を比較するメソッドですが、同じように文字列を比較するメソッドとして、equalsメソッドがあります。

equalsメソッドは文字列を単純に比較する機能を有しています。

compareToメソッドは辞書式といって、アルファベット順に文字列を比較することが可能です。

この辞書式の比較はUnicodeという形式の文字コードで行っています。

compareToメソッドでの比較は、文字列自体を日本語の「ひらがな」か「カタカナ」のどちらかに限定することで比較できます。

しかし、「ひらがな」「カタカナ」「英文字」を混在させてしまうとうまく比較ができません。

compareToメソッドは、大文字と小文字を区別して評価します。

大文字と小文字を無視して評価する場合は、compareTolgnoreCase( )メソッドを利用することで処理が可能になります。

 

compareToの書き方

次の書き方を使用することで、compareToを使用した辞書式の文字列比較を行うことが可能です。

文字列1.compareTo(文字列2)

 

次に、実際に文字列を比較してみます。

今回は、同様に文字列を比較するequalsメソッドを利用する書き方も一緒に示してみます。

 

equalsを使用して、String(文字列)型を比較する場合

ここでは、equalsを使用して、String(文字列)型を比較してみます。

サンプルコード

String a = "Moji";
String b = "Moji";
if (a.equals(b))) {
  /* 実行結果:aとbは同じです。 */
  System.out.println("aとbは同じです。");
}

実行結果

aとbは同じです。

 

compareToを使用して、String(文字列)型を比較する場合

ここでは、compareToを使用して、String(文字列)型を比較してみます。

サンプルコード

String a = "Moji";
String b = "Moji";
if (a.compareTo(b) == 0) {
  /* 実行結果:aとbは同じです。 */
  System.out.println("aとbは同じです。"); //実行結果:aとbは同じです。
}

実行結果:

aとbは同じです。

 

compareToを使用して、java.time.LocalDate(日付)型を比較する場合

ここでは、compareToを使用して、java.time.LocalDate(日付)型を比較してみます。

 

サンプルコード

LocalDateTime date = LocalDateTime.parse("2021-01-01T11:11:11.000");
if (date1.compareTo(date) > 0){ 
	System.out.println("trueです"); // trueです
}

実行結果:

trueです

 

compareToを使用して、BigDecimalの値を比較する場合

ここでは、compareToを使用して、BigDecimalの値を比較してみます。

BigDecimalとは、誤差が出ないように正確な値を利用するクラスです。

 

サンプルコード

BigDecimal bd1 = new BigDecimal("1");
BigDecimal bd2 = new BigDecimal("2");
if (bd1.compareTo(bd2) < 0) {
    System.out.println(bd2 + "の方が大きい");
} else {
    System.out.println(bd1 + "の方が大きいか、等しい。");
}

実行結果

2の方が大きい

 

compareToを使用して、wrapperクラスの値を比較する場合

ここでは、compareToを使用して、wrapperクラスの値を比較してみます。

ラッパークラスとは、基本データ型の値をラップしてオブジェクトとして利用できるようにするクラスです。

 

ラッパークラス一覧

基本データ型 ラッパークラス
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double

ラッパークラスを使用した場合のcompareToの結果

結果が-1

メソッドの呼び出し元の値が、引数の値より小さいという意味です。

結果が1

メソッドの呼び出し元の値が、引数の値より大きいという意味です。

結果が0

メソッドの呼び出し元の値が、引数の値と同じという意味です。

サンプルコード

Integer num1 = new Integer(1);
Integer num2 = new Integer(10);
System.out.println(num1.compareTo(num2));

実行結果

-1

 

 

田島悠介

compareToの基本形と、一致かどうかを調べてみた場合の例だね。

大石ゆかり

一致の場合は0になるので、こういう書き方になるんですね。

田島悠介

それでは実際にcompareToを使ってみよう。辞書での順番を比較して、それぞれの場合で別の処理を行うように設定するよ。

 

[PR] 未経験からWebエンジニアを目指す方法とは

辞書式の評価方法

ここでは辞書式の評価方法について解説します。

評価方法

辞書式の文字列比較というのは、辞書で先に現れる場合は小さいと考え、辞書で後に現れる場合は大きいと考えます。

辞書で先に現れる例として、aはbより先に現れます。

辞書で後に現れる例として、bはaより後に現れます。

つまり、aのほうがbよりも小さいということです。

例えば、紙の辞書を使う時にaのほうがbよりも先に記載されていると思います。

数字で言えば、123という順番で小さい順に並んでいます。

英文字も同様に、abcの順番で小さい順番に並んでいるということです。

 

評価結果

比較評価した結果、次の値を返します。

完全一致の場合は0を返します。

文字列1が文字列2より辞書式で小さい場合は、0より小さい負の値を返します。

文字列1が文字列2より辞書式で大きい場合は、0より大きい正の値を返します。

負の値の例としては-1です。

正の値の例としては1です。

 

辞書式評価プログラム

辞書式の評価処理をわかりやすいプログラムで解説します。

サンプルコード

import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
        String text_a = "a";
        String text_b = "b";
        System.out.println(text_a.compareTo(text_b));
        System.out.println(text_b.compareTo(text_a));
        System.out.println(text_a.compareTo(text_a));
    }
}

 

解説

String text_a = “a”;では、text_aという変数に文字列のaを代入しています。

text_aと記載しているように、この変数にaという文字が入っていることを念頭に読み進めてみてください。

String text_b = “b”;では、text_bという変数に文字列のbを代入しています。

text_bと記載しているように、この変数にbという文字が入っていることを念頭に読み進めてみてください。

System.out.println(text_a.compareTo(text_b));では、呼び出し元text_aと引数text_bを比較しています。

呼び出し元text_aのほうが引数text_bより小さいため、-1が結果になります。

System.out.println(text_b.compareTo(text_a));では、呼び出し元text_bと引数text_aを比較しています。

呼び出し元text_bのほうが引数text_aより大きいため、1が結果になります。

System.out.println(text_a.compareTo(text_a));

では、呼び出し元text_aと引数text_aを比較しています。

呼び出し元text_aと引数text_aは同じなので、0が結果になります。

実際に辞書式を利用したプログラムを、「compareToを使用した例を実際に書いてみよう」でも用意しておりますので、動作確認しながら学習してみてください。

 

実行結果

 

 

compareToを使用した例を実際に書いてみよう

今回は、辞書式で先に現れる文字列かどうかを調べるプログラムを実装していきます。

辞書式で先に現れるかどうかは、辞書で調べたときに、辞書の1ページ目から考えて、先に記載されているかどうかということを意味します。

 

サンプルコード

public class Jisho {
  public static void main(String[] args) {
    /* 比較結果表示用の文字列 */
    String kekka = "辞書で先に記載されている文字列は、";
    /* 文字列1 */
    String moji1 = "apple";
    /* 文字列2 */
    String moji2 = "orange";
    /* 文字列比較 */
    if( moji1.compareTo(moji2) < 0 ) {
      /* 比較結果でmoji1の方が辞書式で先に現れる場合 */
      kekka = kekka + moji1;
    } else if ( moji1.compareTo(moji2) > 0 ) {
      /* 比較結果でmoji2の方が辞書式で先に現れる場合 */
      kekka = kekka + moji2;
    } else {
      /* moji1とmoji2が同じ場合 */
      kekka = moji1 + "と" + moji2 + "は同じ文字列です。";
    }
    /* 実行結果:辞書で先に記載されている文字列は、apple */
    System.out.println(kekka);
  }
}

解説

public class Jisho {では、Jishoクラスを作成しています。

public static void main(String[] args) {では、Jishoクラスの実装を開始しています。

String kekka = “辞書で先に記載されている文字列は、”;では、比較結果表示用の文字列を文字列型のkekkaに代入しています。

String moji1 = “apple”;では、文字列型のmoji1にappleという値を代入しています。

String moji2 = “orange”;では、文字列型のmoji2にorangeという値を代入しています。

if( moji1.compareTo(moji2) < 0 ) {では、if文を利用してmoji1とmoji2をcompareToで比較しています。

条件に合致する場合、-1という結果が返ってくることを意味します。

メソッドの呼び出し元の値moji1が、引数の値moji2より小さいという意味です。

kekka = kekka + moji1;では、比較結果でmoji1の方が辞書式で先に現れる場合の表示を変数kekkaに代入する処理をしています。

つまり、より小さいmoji1が、辞書で先に記載されている文字列だからです。

} else if ( moji1.compareTo(moji2) > 0 ) {では、if文を利用してmoji1とmoji2をcompareToで比較しています。

条件に合致する場合、1という結果が返ってくることを意味します。

メソッドの呼び出し元の値moji1が、引数の値moji2より大きいという意味です。

kekka = kekka + moji2;では、比較結果でmoji2の方が辞書式で先に現れる場合の表示を変数kekkaに代入する処理をしています。

つまり、より小さいmoji2が、辞書で先に記載されている文字列だからです。

} else {では、どちらのif文の条件にも当てはまらなかったmoji1とmoji2が同じ場合 の処理を実行します。

kekka = moji1 + “と” + moji2 + “は同じ文字列です。”;では、変数moji1の値と変数moji2の値が同じ文字列です。という表示を、変数kekkaに代入する処理をしています。

}では、elseの処理を終了します。

System.out.println(kekka);では結果を表示します。

}では、2行目の処理を終了します。

}では、1行目の処理を終了します。

今回は、appleを変数moji1に代入、orangeを変数moji2に代入して、compareToメソッドを利用して比較しました。

辞書では、appleの方がorangeよりも先に記載されているので、実行結果は、「辞書で先に記載されている文字列は、apple」になります。

 

実行結果

 

まとめ

今回は、compareToを利用した辞書式で文字列を比較する方法を解説しました。

compareToを使用して、StringやLocalDateやBigDecimalやwrapperクラスを比較してみました。

辞書で先に記載されている文字列の検出をすることで、より実践的なcompareToの使い方を学習しました。

入門向けJavaの学習サイトもまとめているので、あわせてご覧ください。

 

田島悠介

compareToで返ってきた値が0より大きいか小さいか、等しいかによって分けることができるんだ。

大石ゆかり

それによって変数moji1が先の場合、moji2が先の場合、両方同じだった場合を条件としたわけですね。

田島悠介

上で説明したように、文字列が一致するかどうかだけを調べる場合はequalsというのもあるんだ。一緒に覚えておこう。

大石ゆかり

了解です。ありがとうございました!

 

Javaを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのJavaコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、JavaやServletの技術を使ったWebアプリケーション開発を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!