compareTo
日本語 | 比較 |
英語 | compare to |
ふりがな | こんぺあとぅー |
フリガナ | コンペアトゥー |
ふたつの値を比較し大小の結果を返すメソッド。
Comparableインターフェイスのメソッドを実装したもの。
Integerクラス等のラッパークラスや、Stringクラス等が実装している。
compareTo()メソッドは「A.compareTo( B )」の形式で使用する。
この戻り値は、「A」が「B」より小さいとマイナス、一致は0、それ以外はプラスとなる。
これは「A - B」の結果と一致する。
一般に比較を行うためのメソッドとして使用する。
また、Arraysクラスのsort()メソッド等、比較を行う場合には、compareTo()メソッドの実装が必要となる場合がある。
その場合、まずComparableインターフェイスを実装し、そのcompareTo()メソッドを実装する。その戻り値は、比較結果としてマイナス、0、プラスのいずれかを返す。
この時、compareTo()メソッドの中では、上記の例で言えば「this」が「A」に、「第1引数」が「B」に該当する。
そのため、「this」が「第1引数」より小さいとマイナス、一致は0、それ以外はプラスを戻り値として返すように実装しなければならない。
これは前述のように「this - 第1引数」と同じである。また、比較対象にcompareTo()メソッドを使用できるのであればその結果を返してもよい。それ以外であれば、ifやswitchを使用して比較を行えばよい。
Comparableインターフェイスのメソッドを実装したもの。
Integerクラス等のラッパークラスや、Stringクラス等が実装している。
compareTo()メソッドは「A.compareTo( B )」の形式で使用する。
この戻り値は、「A」が「B」より小さいとマイナス、一致は0、それ以外はプラスとなる。
これは「A - B」の結果と一致する。
一般に比較を行うためのメソッドとして使用する。
また、Arraysクラスのsort()メソッド等、比較を行う場合には、compareTo()メソッドの実装が必要となる場合がある。
その場合、まずComparableインターフェイスを実装し、そのcompareTo()メソッドを実装する。その戻り値は、比較結果としてマイナス、0、プラスのいずれかを返す。
この時、compareTo()メソッドの中では、上記の例で言えば「this」が「A」に、「第1引数」が「B」に該当する。
そのため、「this」が「第1引数」より小さいとマイナス、一致は0、それ以外はプラスを戻り値として返すように実装しなければならない。
これは前述のように「this - 第1引数」と同じである。また、比較対象にcompareTo()メソッドを使用できるのであればその結果を返してもよい。それ以外であれば、ifやswitchを使用して比較を行えばよい。
// Sample.java
import java.util.Arrays;
public class Sample
{
public static void main( String[] args )
{
// プリミティブ型のラッパークラスや、Stringクラスに実装されています。
System.out.println( "ABC".compareTo( "DEF" ) );
// -3
System.out.println( "ABC".compareTo( "ABC" ) );
// 0
System.out.println( "DEF".compareTo( "ABC" ) );
// 3
// つまり、compareTo()メソッドを呼ぶ際の「左側」の方が小さいと
// マイナス、一致なら0、それ以外はプラスが返ってきます。
// (何をもって「小さい」「大きい」と判断するかは比較対象に
// よって決まります。文字列であれば辞書順、ということです)
// 自分で作ったクラスで試してみます。
Data data = new Data( 100 );
// Dataクラスの配列を作ります。
Data[] datas = new Data[]
{ new Data( 300 )
, new Data( 100 )
, new Data( 200 )
};
// とりあえず確認用に出力。
for( int iF1 = 0; iF1 < datas.length; ++iF1 )
{
System.out.print( datas[iF1].i + ", " );
}
System.out.println();
// 300, 100, 200,
// ソートします。
Arrays.sort( datas );
for( int iF1 = 0; iF1 < datas.length; ++iF1 )
{
System.out.print( datas[iF1].i + ", " );
}
System.out.println();
// 100, 200, 300,
// このソートの際に「Dataクラスの比較」が
// 行われていて、そこでcompareTo()メソッドが
// 使われています。
}
}
/**
* データクラス。
* Comparableインターフェイスを実装します。
*/
class Data implements Comparable
{
/**
* フィールド。
* この中の値で比較を行います。
*/
public int i = 0;
/**
* コンストラクタ。
*/
public Data( int i )
{
this.i = i;
}
/**
* 比較用メソッドcompareTo()を実装します。
* このメソッドがArraysクラスのsort()メソッド内で
* 呼び出されて、各要素の比較が行われます。
*/
public int compareTo( Object object )
{
// 引数に「配列のある一要素」が渡されるのでキャストします。
Data data = (Data)object;
// ちなみに自分自身(this)も「配列のある一要素」です。
// このふたつを比較した結果を返します。
return this.i - data.i;
// プリミティブ型なら上記のように「this - object」が
// 一番簡単でしょう。
// クラスの場合はcompareTo()メソッドを、
// プリミティブ型の場合にはラッパークラスの
// compareTo()メソッドを使用するのがいいでしょう。
// それが不可能な場合や、特別な結果を返す場合、
// thisの方が「上」「前」「先」「小さい」「少ない」ならマイナス、
// 一致してるなら0、それ以外はプラスを返す、としてもいいでしょう。
}
}
import java.util.Arrays;
public class Sample
{
public static void main( String[] args )
{
// プリミティブ型のラッパークラスや、Stringクラスに実装されています。
System.out.println( "ABC".compareTo( "DEF" ) );
// -3
System.out.println( "ABC".compareTo( "ABC" ) );
// 0
System.out.println( "DEF".compareTo( "ABC" ) );
// 3
// つまり、compareTo()メソッドを呼ぶ際の「左側」の方が小さいと
// マイナス、一致なら0、それ以外はプラスが返ってきます。
// (何をもって「小さい」「大きい」と判断するかは比較対象に
// よって決まります。文字列であれば辞書順、ということです)
// 自分で作ったクラスで試してみます。
Data data = new Data( 100 );
// Dataクラスの配列を作ります。
Data[] datas = new Data[]
{ new Data( 300 )
, new Data( 100 )
, new Data( 200 )
};
// とりあえず確認用に出力。
for( int iF1 = 0; iF1 < datas.length; ++iF1 )
{
System.out.print( datas[iF1].i + ", " );
}
System.out.println();
// 300, 100, 200,
// ソートします。
Arrays.sort( datas );
for( int iF1 = 0; iF1 < datas.length; ++iF1 )
{
System.out.print( datas[iF1].i + ", " );
}
System.out.println();
// 100, 200, 300,
// このソートの際に「Dataクラスの比較」が
// 行われていて、そこでcompareTo()メソッドが
// 使われています。
}
}
/**
* データクラス。
* Comparableインターフェイスを実装します。
*/
class Data implements Comparable
{
/**
* フィールド。
* この中の値で比較を行います。
*/
public int i = 0;
/**
* コンストラクタ。
*/
public Data( int i )
{
this.i = i;
}
/**
* 比較用メソッドcompareTo()を実装します。
* このメソッドがArraysクラスのsort()メソッド内で
* 呼び出されて、各要素の比較が行われます。
*/
public int compareTo( Object object )
{
// 引数に「配列のある一要素」が渡されるのでキャストします。
Data data = (Data)object;
// ちなみに自分自身(this)も「配列のある一要素」です。
// このふたつを比較した結果を返します。
return this.i - data.i;
// プリミティブ型なら上記のように「this - object」が
// 一番簡単でしょう。
// クラスの場合はcompareTo()メソッドを、
// プリミティブ型の場合にはラッパークラスの
// compareTo()メソッドを使用するのがいいでしょう。
// それが不可能な場合や、特別な結果を返す場合、
// thisの方が「上」「前」「先」「小さい」「少ない」ならマイナス、
// 一致してるなら0、それ以外はプラスを返す、としてもいいでしょう。
}
}
// Sample.java import java.util.Arrays; public class Sample { public static void main( String[] args ) { // プリミティブ型のラッパークラスや、Stringクラスに実装されています。 System.out.println( "ABC".compareTo( "DEF" ) ); // -3 System.out.println( "ABC".compareTo( "ABC" ) ); // 0 System.out.println( "DEF".compareTo( "ABC" ) ); // 3 // つまり、compareTo()メソッドを呼ぶ際の「左側」の方が小さいと // マイナス、一致なら0、それ以外はプラスが返ってきます。 // (何をもって「小さい」「大きい」と判断するかは比較対象に // よって決まります。文字列であれば辞書順、ということです) // 自分で作ったクラスで試してみます。 Data data = new Data( 100 ); // Dataクラスの配列を作ります。 Data[] datas = new Data[] { new Data( 300 ) , new Data( 100 ) , new Data( 200 ) }; // とりあえず確認用に出力。 for( int iF1 = 0; iF1 < datas.length; ++iF1 ) { System.out.print( datas[iF1].i + ", " ); } System.out.println(); // 300, 100, 200, // ソートします。 Arrays.sort( datas ); for( int iF1 = 0; iF1 < datas.length; ++iF1 ) { System.out.print( datas[iF1].i + ", " ); } System.out.println(); // 100, 200, 300, // このソートの際に「Dataクラスの比較」が // 行われていて、そこでcompareTo()メソッドが // 使われています。 } } /** * データクラス。 * Comparableインターフェイスを実装します。 */ class Data implements Comparable { /** * フィールド。 * この中の値で比較を行います。 */ public int i = 0; /** * コンストラクタ。 */ public Data( int i ) { this.i = i; } /** * 比較用メソッドcompareTo()を実装します。 * このメソッドがArraysクラスのsort()メソッド内で * 呼び出されて、各要素の比較が行われます。 */ public int compareTo( Object object ) { // 引数に「配列のある一要素」が渡されるのでキャストします。 Data data = (Data)object; // ちなみに自分自身(this)も「配列のある一要素」です。 // このふたつを比較した結果を返します。 return this.i - data.i; // プリミティブ型なら上記のように「this - object」が // 一番簡単でしょう。 // クラスの場合はcompareTo()メソッドを、 // プリミティブ型の場合にはラッパークラスの // compareTo()メソッドを使用するのがいいでしょう。 // それが不可能な場合や、特別な結果を返す場合、 // thisの方が「上」「前」「先」「小さい」「少ない」ならマイナス、 // 一致してるなら0、それ以外はプラスを返す、としてもいいでしょう。 } }