お知らせ
2023.12.5(Tue)
目次
こんにちは。関口です。
今回はJava初心者向けにcompareToメソッドの基本的な使い方と、よくある間違いを紹介していきます。
compareToメソッドは、2つの値を比較する際に使用します。
似たメソッドとして、「equals」「compare」「compareToIgnoreCase」がありますが、今回の記事では触れません。興味のある方は調べてみてください!
compareToは、次のように記載します。
結果は次のようになります。
あえて言うことでもないですが、比較値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の方が小さいです
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
いかがでしたでしょうか。
なんとなくの知識で作ってしまうと、場合によっては誤った動きになってしまいます。正しい知識を身につけて、楽しくJavaを使っていきましょう!
《関連記事》