エンジニア直伝!JavaでcompareToを便利に使う方法

18/12/16 13:25:51     19/05/05 16:52:37

javaのイメージ

compareToメソッドは、値の大小比較を行うメソッドです。

似たようなものにequalsメソッドがありますが、こちらは値が同じかどうかを判定するメソッドになります。compareToメソッドの基本は数値比較ですが、文字列の比較、日付の比較、リストやマップをソートする、といった応用的な使用方法もあります。

このページでは、compareToメソッドの便利な使い方をサンプルコード付きで解説していきます。

compareToの基本的な使い方

まずは基本編です。もっともオーソドックスなcompareToの使い方を説明します。基本的な文法としては以下のように記述します。

変数1.compareTo(変数2)

そして、戻り値としては変数1-変数2の結果を返します。変数1が変数2より大きければ正の値、逆の場合は負の値、同じである場合は0です。サンプルコードで確かめてみると、以下のようになります。

public class Main {
     public static void main(String[] args) {
          Integer num1 = new Integer(1);
          Integer num2 = new Integer(2);

          System.out.println(num1.compareTo(num2));
          System.out.println(num2.compareTo(num1));
          System.out.println(num1.compareTo(num1));
     }
}

上記のソースコードを実行すると以下のようにコンソール出力されます。

-1
1
0

左-右なので、どっちがどっちか混乱することもあまりないかと思います。

String型の文字列比較

compareToメソッドは、数値だけでなく文字列を比較することも可能です。

ただし文字列比較の場合も戻り値は数値です。文字列比較で何の数値が戻ってくるかというと、Unicode値です。

二つの文字列のUnicode値がどれだけ離れているかを返します。具体的なサンプルコードは以下です。

public class Main {
     public static void main(String[] args) {
          String str1 = "a";
          String str2 = "b";
          String str3 = "A";

          System.out.println(str1.compareTo(str2));
          System.out.println(str2.compareTo(str1));
          System.out.println(str1.compareTo(str1));
          System.out.println(str1.compareTo(str3));
          System.out.println(str1.compareToIgnoreCase(str3));
     }
}

上記のコードを実行した出力結果は以下です。

-1
1
0
32
0

文字コードの詳細な説明は割愛しますが、まず小文字同士で比較するとアルファベットの順序の差がそのまま数値に現れます。小文字と大文字で比較すると文字コードが離れていることがわかります。

5つめの出力のcompareToIgonoreCaseについてですが、これは小文字と大文字の歳を無視するためのコードです。同じaもしくはAとして比較されているため、0を返しています。

日付の比較

compareToメソッドは、日付の比較に使用されることも多いです。システムにもよりますが、世の中に出回っているシステムでcompareToが使われているもののなかの多くは日付比較がされています。

普通に数値比較するよりも、日付比較で使われることの方がむしろ多いかもしれません。たとえばユーザーがフォームに日付を入力する際に、現在日付を取得比較し、現在日付よりも前の日付を入力するとエラーになる、といったシステムも多いです。

サンプルコードは以下のようになります。

import java.util.Date;

public class Main {
     public static void main(String[] args) {

          Date date1 = new Date(2018, 12, 28, 16, 20, 22);
          Date date2 = new Date(2018, 12, 29, 16, 20, 24);

          System.out.println(date1.compareTo(date2));
          System.out.println(date2.compareTo(date1));
          System.out.println(date1.compareTo(date1));
     }
}

上記のコードを実行すると、以下のようにコンソール出力されます。

-1
1
0

基本的には数値比較のときと同じですが、日数の違いを数値化するような機能はありません。左の数値の方が大きければ1、逆の場合は-1、同じ日付なら0を出力します。

その他の比較

他にも、compareToを使用して以下のような比較を行うことも可能です。

BigDecimal

以下のようにBigDecimalを使用して比較できます。

import java.math.BigDecimal;

class Main{
     public static void main (String[] args){
          BigDecimal three = new BigDecimal(3);
          BigDecimal five = new BigDecimal(5);

          int result1 = three.compareTo(five);
          System.out.println(result1);
          int result2 = three.compareTo(three);
          System.out.println(result2);
          int result3 = five.compareTo(three);
          System.out.println(result3);
     }
}

-1
0
1

BigDecimalはデータ型ではなくクラスですが、クラスでもcompareToを使用して比較することが可能です。

ラッパークラス

BigDecimal同様、ラッパークラスを使って値を比較することも可能です。具体的には以下のサンプルコードのようになります。

public class Main{

     public static void main(String args[]) {
          Integer int1 = new Integer(12);
          Integer int2 = new Integer(10) ;
          // compareToで比較
          System.out.println(int1.compareTo(int2));
     }

}

上記のソースコードを実行すると、1が出力されます。

以上のように、caompareToは数値だけでなくいろいろなものを比較できます。いきなりすべて覚える必要はありません。徐々に慣れていけば良いかと思います。また今回は紹介しませんが、リストやマップをソートすることも可能です。

比較できるものが多くて難しく感じるかもしれませんが、結局のところ変数かオブジェクトを宣言し、それを比較しているだけです。プリミティブ型かクラスかによって違いがあるのは宣言部分や戻り値だけで、比較の仕方自体はまったく同じです。

つまり、難しいことは特にありません。また特に業務用システムなどではわりと使用頻度の高いコードなので、そのうち慣れます。

Javaのフリーランス案件をチェック

→Javaの案件情報一覧はこちら

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する