Javaで値の比較がしたい? 数値、日付、文字列のcompareToを使ってみよう!

こんにちは。関口です。
 
今回はJava初心者向けにcompareToメソッドの基本的な使い方と、よくある間違いを紹介していきます。

目次

  1. compareToメソッドとは
  2. 基本的な使い方
  3. Integer型の比較
  4. BigDecimal型の比較
  5. Date型の比較
  6. Calendar型の比較
  7. String型の比較
  8. こんなこともできます
  9. よくある間違い
  10. まとめ

compareToメソッドは、2つの値を比較する際に使用します。
 
似たメソッドとして、「equals」「compare」「compareToIgnoreCase」がありますが、今回の記事では触れません。興味のある方は調べてみてください!

compareToは、次のように記載します。
 

比較値A.compareTo(比較値B)

結果は次のようになります。
 

比較値A(左側の値)が比較値B(右側の値)よりも大きい場合は1以上の正数値。
比較値A(左側の値)が比較値B(右側の値)よりも小さい場合は負の数値。
比較値A(左側の値)が比較値B(右側の値)と等しい場合は0。

あえて言うことでもないですが、比較値Aと比較値Bは同じ型でなければエラーになります。
 
それでは実際に、比較値の型による結果の違いを見てみましょう。

どんなに差がある数値を比較しても、結果は1、0、-1のいずれかになります。

// Integer型の比較
Integer integer1 = 102;
Integer integer2 = 500;

// 102と102を比較
System.out.println("integer1.compareTo(integer1) = "
                   + integer1.compareTo(integer1));
// 102と500を比較
System.out.println("integer1.compareTo(integer2) = "
                   + integer1.compareTo(integer2));
// 500と102を比較
System.out.println("integer2.compareTo(integer1) = "
                   + integer2.compareTo(integer1));

実行結果
// 102と102は等しい
integer1.compareTo(integer1) = 0
// 102が500よりも小さい
integer1.compareTo(integer2) = -1
// 500が102よりも大きい
integer2.compareTo(integer1) = 1

どんなに差がある数値を比較しても、結果は1、0、-1のいずれかになります。

// BigDecimal型の比較
BigDecimal dec1 = new BigDecimal("8");
BigDecimal dec2 = new BigDecimal("10");

// 8と8を比較
System.out.println("dec1.compareTo(dec1) = " + dec1.compareTo(dec1));
// 8と10を比較
System.out.println("dec1.compareTo(dec2) = " + dec1.compareTo(dec2));
// 10と8を比較
System.out.println("dec2.compareTo(dec1) = " + dec2.compareTo(dec1));

実行結果
// 8と8は等しい
dec1.compareTo(dec1) = 0
// 8が10よりも小さい
dec1.compareTo(dec2) = -1
// 10が8よりも大きい
dec2.compareTo(dec1) = 1

どんなに差がある日付を比較しても、結果は1、0、-1のいずれかになります。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Date date1 = new Date();
Date date2 = sdf.parse("2021/04/01");

// date1の値を出力
System.out.println("date1:" + date1);
// date2の値を出力
System.out.println("date2:" + date2);

// 2021年3月30日と2021年3月30日を比較
System.out.println("date1.compareTo(date1) = " + date1.compareTo(date1));
// 2021年3月30日と2021年4月1日を比較
System.out.println("date1.compareTo(date2) = " + date1.compareTo(date2));
// 2021年4月1日と2021年3月30日を比較
System.out.println("date2.compareTo(date1) = " + date2.compareTo(date1));

実行結果
date1:Tue Mar 30 21:51:16 JST 2021
date2:Thu Apr 01 00:00:00 JST 2021

// 2021年3月30日と2021年3月30日は等しい
date1.compareTo(date1) = 0
// 2021年3月30日が2021年4月1日よりも小さい
date1.compareTo(date2) = -1
// 2021年4月1日が2021年3月30日よりも大きい
date2.compareTo(date1) = 1

どんなに差がある日付を比較しても、結果は1、0、-1のいずれかになります。

// Calendar型の比較
Calendar cal1 = Calendar.getInstance();
cal1.set(2021, 4, 01, 9, 12, 34);
Calendar cal2 = Calendar.getInstance();
cal2.set(2021, 10, 15, 10, 22, 33);

// 2021年4月1日と2021年4月1日を比較
System.out.println("cal1.compareTo(cal1) = " + cal1.compareTo(cal1));
// 2021年4月1日と2021年10月15日を比較
System.out.println("cal1.compareTo(cal2) = " + cal1.compareTo(cal2));
// 2021年10月15日と2021年4月1日を比較
System.out.println("cal2.compareTo(cal1) = " + cal2.compareTo(cal1));

実行結果
// 2021年4月1日と2021年4月1日は等しい
cal1.compareTo(cal1) = 0
// 2021年4月1日が2021年10月15日よりも小さい
cal1.compareTo(cal2) = -1
// 2021年10月15日が2021年4月1日よりも大きい
cal2.compareTo(cal1) = 1

Unicode値の順序差により、結果が返却されます。今まで紹介した数値や日付の比較と違い、1、0、-1のどれかではなく順序の差分値が返ります。

// String型の比較
String string1 = "い";
String string2 = "か";

// 「い」と「い」を比較
System.out.println("string1.compareTo(string1) = " + string1.compareTo(string1));
// 「い」と「か」を比較
System.out.println("string1.compareTo(string2) = " + string1.compareTo(string2));
// 「か」と「い」を比較
System.out.println("string2.compareTo(string1) = " + string2.compareTo(string1));

実行結果
// 「い」と「い」は等しい
string1.compareTo(string1) = 0
// 「い」が「か」よりも7小さい
string1.compareTo(string2) = -7
// 「か」が「い」よりも7大きい
string2.compareTo(string1) = 7

Date型をString型に変換(フォーマット)して比較することもできます。

// Date型をString型に変換(フォーマット)して比較
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date1 = new Date();
String strDate1 = sdf.format(date1); // 20210330
String strDate2 = "20211001";

// strDate1の値を出力
System.out.println("strDate1:" + strDate1);
// strDate2の値を出力
System.out.println("strDate2:" + strDate2);

// 「20210330」と「20211001」を比較
if (strDate1.compareTo(strDate2) < 0) {
	// 「20210330」が「20211001」よりも小さい場合
	System.out.println("strDate1よりstrDate2の方が大きいです");

} else {
	// 「20210330」が「20211001」よりも大きい場合
	System.out.println("strDate1よりstrDate2の方が小さいです");
}

実行結果
strDate1:20210330
strDate2:20211001

// 比較結果
strDate1よりstrDate2の方が大きいです

日付型で年月日だけで比較したい場合に便利ですね!

Calendar型の時分だけで比較したい場合。

// Calendar型をString型に変換(時間だけに)して比較
Calendar cal1 = Calendar.getInstance();
cal1.set(2021, 4, 01, 9, 12, 34);
Calendar cal2 = Calendar.getInstance();
cal12.set(2021, 10, 15, 10, 22, 33);

// 2021年4月1日 9時12分34秒から、時分のみ取得しString型に変換
String strCal1 = String.valueOf(cal1.get(Calendar.HOUR_OF_DAY))
				 	+ String.valueOf(cal1.get(Calendar.MINUTE));
// 2021年10月15日 10時22分33秒から、時分のみ取得しString型に変換
String strCal2 = String.valueOf(cal2.get(Calendar.HOUR_OF_DAY))
				 	+ String.valueOf(cal2.get(Calendar.MINUTE));

// strCal1の値を出力
System.out.println("strCal1:" + strCal1);
// strCal2の値を出力
System.out.println("strCal2:" + strCal2);

// 「912」と「1022」を比較
if (strCal1.compareTo(strCal2) < 0) {
	// 「912」が「1022」よりも小さい場合
	System.out.println("strCal1よりstrCal2の方が大きいです");

} else {
	// 「912」が「1022」よりも大きい場合
	System.out.println("strCal1よりstrCal2の方が小さいです");
}

実行結果
strCal1:912
strCal2:1022

// 比較結果
strCal1よりstrCal2の方が小さいです

期待していた結果と異なりますね。なぜでしょうか?
 
strCal1.compareTo(strCal2) の結果は「8」となります。1文字目の「1」と「9」を比べた結果になっていることがわかりますね。次の場合はどうなるでしょうか。
Calendar cal1 = Calendar.getInstance();
cal1.set(2021, 4, 01, 9, 12, 34);
Calendar cal2 = Calendar.getInstance();
cal2.set(2021, 10, 15, 9, 33, 33);

// 2021年4月1日 9時12分34秒から、時分のみ取得しString型に変換
String strCal1 = String.valueOf(cal1.get(Calendar.HOUR_OF_DAY))
					 + String.valueOf(cal1.get(Calendar.MINUTE));
// 2021年10月15日 9時33分33秒から、時分のみ取得しString型に変換
String strCal2 = String.valueOf(cal2.get(Calendar.HOUR_OF_DAY))
					 + String.valueOf(cal2.get(Calendar.MINUTE));

// strCal1の値を出力
System.out.println("strCal1:" + strCal1);
// strCal2の値を出力
System.out.println("strCal2:" + strCal2);

// 「912」と「933」を比較
System.out.println("strCal1.compareTo(strCal2) = " + strCal1.compareTo(strCal2));
// 「933」と「912」を比較
System.out.println("strCal2.compareTo(strCal1) = " + strCal2.compareTo(strCal1));

実行結果
strCal1:912
strCal2:933

// 「912」が「933」より2小さい
strCal1.compareTo(strCal2) = -2
// 「933」が「912」より2大きい
strCal2.compareTo(strCal1) = 2

1文字目が一致する場合は、2文字目の「1」と「3」を比べた結果になっていることがわかりますね。String型の数値の場合、先頭から順に大小の比較を行うということを覚えておきましょう!

いかがでしたでしょうか。
 
なんとなくの知識で作ってしまうと、場合によっては誤った動きになってしまいます。正しい知識を身につけて、楽しくJavaを使っていきましょう!
 
 
 
 
《関連記事》

記事をシェア
MOST VIEWED ARTICLES