お知らせ
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を使っていきましょう!
《関連記事》