Comparator
日本語 | 比較者 |
英語 | comparator |
ふりがな | こんぱれーたー、こんぱれいたー、こんぺあれーたー、こんぺあれいたー |
フリガナ | コンパレーター、コンパレイター、コンペアレーター、コンペアレイター |
比較処理を行うクラスのためのインターフェイス。
Arraysクラスのsort()メソッドを、Comparableインターフェイス実装クラス以外のクラスに対して使用する場合、このComparatorインターフェイスの実装クラスも一緒にsort()メソッドに渡す必要がある。
ソートを行う場合「要素の比較」を行う必要がある。
プリミティブ型であれば<演算子等によって比較ができる。また、クラスであってもComparableインターフェイスの実装クラスであればComparableインターフェイスのcompareTo()メソッドを使用して比較することができる。
ところが、Comparableインターフェイスの実装クラスでないクラスは、それぞれの要素を比較することができない。
そういったクラスをソートするためのクラスが、Comparatorインターフェイスの実装クラスである。Comparatorインターフェイスのcompare()メソッドを実装し、「2つの要素を比較する」処理を実装する。このクラスをArraysクラスのsort()メソッドに渡すことで、メソッド内でComparatorインターフェイスを通して実装されたcompare()メソッドが呼ばれ、各要素の比較が行われソートされる。
compare()メソッドは引数を2つ持つ。この2つの引数には、比較する要素が渡される。
compare()メソッドの戻り値は、第1引数の方が小さいとマイナス、一致は0、それ以外はプラスとなる。これは「第1引数 - 第2引数」の結果と一致する。
基本的にはComparableインターフェイスのcompareTo()メソッドと同じのためそちらを参考のこと。
Comparatorインターフェイスを使用したソートは、基本的にはComparableインターフェイス実装クラス以外のクラスをソートする場合に使用するものだが、それ以外にも「任意の順番でソートしたい」場合にも使用できる。
たとえば、昇順ではなく降順でソートしたい場合や、複数のデータを持つクラスについて細かく比較方法を変更したい場合といった場合に、必要なクラスを必要なだけ作ることになる。
いずれにせよ、Arraysクラスのsort()メソッドを使用することにかわりはなく、故に修正マージソートでソートされることになる。ソートの方法は全く変えることなく、比較方法だけをコントロールするための方法が、このインターフェイスを利用することの大きなメリットである。
Arraysクラスのsort()メソッドを、Comparableインターフェイス実装クラス以外のクラスに対して使用する場合、このComparatorインターフェイスの実装クラスも一緒にsort()メソッドに渡す必要がある。
ソートを行う場合「要素の比較」を行う必要がある。
プリミティブ型であれば<演算子等によって比較ができる。また、クラスであってもComparableインターフェイスの実装クラスであればComparableインターフェイスのcompareTo()メソッドを使用して比較することができる。
ところが、Comparableインターフェイスの実装クラスでないクラスは、それぞれの要素を比較することができない。
そういったクラスをソートするためのクラスが、Comparatorインターフェイスの実装クラスである。Comparatorインターフェイスのcompare()メソッドを実装し、「2つの要素を比較する」処理を実装する。このクラスをArraysクラスのsort()メソッドに渡すことで、メソッド内でComparatorインターフェイスを通して実装されたcompare()メソッドが呼ばれ、各要素の比較が行われソートされる。
compare()メソッドは引数を2つ持つ。この2つの引数には、比較する要素が渡される。
compare()メソッドの戻り値は、第1引数の方が小さいとマイナス、一致は0、それ以外はプラスとなる。これは「第1引数 - 第2引数」の結果と一致する。
基本的にはComparableインターフェイスのcompareTo()メソッドと同じのためそちらを参考のこと。
Comparatorインターフェイスを使用したソートは、基本的にはComparableインターフェイス実装クラス以外のクラスをソートする場合に使用するものだが、それ以外にも「任意の順番でソートしたい」場合にも使用できる。
たとえば、昇順ではなく降順でソートしたい場合や、複数のデータを持つクラスについて細かく比較方法を変更したい場合といった場合に、必要なクラスを必要なだけ作ることになる。
いずれにせよ、Arraysクラスのsort()メソッドを使用することにかわりはなく、故に修正マージソートでソートされることになる。ソートの方法は全く変えることなく、比較方法だけをコントロールするための方法が、このインターフェイスを利用することの大きなメリットである。
// Sample.java
import java.util.Arrays;
import java.util.Comparator;
public class Sample
{
public static void main( String[] args )
{
// Comparableインターフェイスの実装クラスではない
// StringBufferクラスをソートするため、
// 専用のComparatorインターフェイス実装クラス
// StringBufferComparatorクラスを使用して
// ソートします。
StringBuffer[] strbufs = new StringBuffer[] { new StringBuffer( "CCC" ), new StringBuffer( "AAA" ), new StringBuffer( "BBB" ) };
Arrays.sort( strbufs, new StringBufferComparator() );
for( int iF1 = 0; iF1 < strbufs.length; ++iF1 )
{
System.out.print( strbufs[iF1].toString() + ", " );
}
System.out.println();
// AAA, BBB, CCC,
// 逆順、つまり降順にソートします。
Arrays.sort( strbufs, new StringBufferReverseComparator() );
for( int iF1 = 0; iF1 < strbufs.length; ++iF1 )
{
System.out.print( strbufs[iF1].toString() + ", " );
}
System.out.println();
// CCC, BBB, AAA,
}
}
/**
* StringBuffer用Comparator。
*/
class StringBufferComparator implements Comparator
{
public int compare( Object lh, Object rh )
{
StringBuffer strbufL = (StringBuffer)lh;
StringBuffer strbufR = (StringBuffer)rh;
// Stringとして取得してそのcompareTo()の結果を
// そのまま使用します。
return strbufL.toString().compareTo( strbufR.toString() );
}
}
/**
* StringBuffer用Comparator(逆順)。
*/
class StringBufferReverseComparator implements Comparator
{
public int compare( Object lh, Object rh )
{
StringBuffer strbufL = (StringBuffer)lh;
StringBuffer strbufR = (StringBuffer)rh;
// Stringとして取得してそのcompareTo()の結果を
// そのまま使用します。ただし、逆順にするために
// マイナスにします。
return - ( strbufL.toString().compareTo( strbufR.toString() ) );
}
}
import java.util.Arrays;
import java.util.Comparator;
public class Sample
{
public static void main( String[] args )
{
// Comparableインターフェイスの実装クラスではない
// StringBufferクラスをソートするため、
// 専用のComparatorインターフェイス実装クラス
// StringBufferComparatorクラスを使用して
// ソートします。
StringBuffer[] strbufs = new StringBuffer[] { new StringBuffer( "CCC" ), new StringBuffer( "AAA" ), new StringBuffer( "BBB" ) };
Arrays.sort( strbufs, new StringBufferComparator() );
for( int iF1 = 0; iF1 < strbufs.length; ++iF1 )
{
System.out.print( strbufs[iF1].toString() + ", " );
}
System.out.println();
// AAA, BBB, CCC,
// 逆順、つまり降順にソートします。
Arrays.sort( strbufs, new StringBufferReverseComparator() );
for( int iF1 = 0; iF1 < strbufs.length; ++iF1 )
{
System.out.print( strbufs[iF1].toString() + ", " );
}
System.out.println();
// CCC, BBB, AAA,
}
}
/**
* StringBuffer用Comparator。
*/
class StringBufferComparator implements Comparator
{
public int compare( Object lh, Object rh )
{
StringBuffer strbufL = (StringBuffer)lh;
StringBuffer strbufR = (StringBuffer)rh;
// Stringとして取得してそのcompareTo()の結果を
// そのまま使用します。
return strbufL.toString().compareTo( strbufR.toString() );
}
}
/**
* StringBuffer用Comparator(逆順)。
*/
class StringBufferReverseComparator implements Comparator
{
public int compare( Object lh, Object rh )
{
StringBuffer strbufL = (StringBuffer)lh;
StringBuffer strbufR = (StringBuffer)rh;
// Stringとして取得してそのcompareTo()の結果を
// そのまま使用します。ただし、逆順にするために
// マイナスにします。
return - ( strbufL.toString().compareTo( strbufR.toString() ) );
}
}
// Sample.java import java.util.Arrays; import java.util.Comparator; public class Sample { public static void main( String[] args ) { // Comparableインターフェイスの実装クラスではない // StringBufferクラスをソートするため、 // 専用のComparatorインターフェイス実装クラス // StringBufferComparatorクラスを使用して // ソートします。 StringBuffer[] strbufs = new StringBuffer[] { new StringBuffer( "CCC" ), new StringBuffer( "AAA" ), new StringBuffer( "BBB" ) }; Arrays.sort( strbufs, new StringBufferComparator() ); for( int iF1 = 0; iF1 < strbufs.length; ++iF1 ) { System.out.print( strbufs[iF1].toString() + ", " ); } System.out.println(); // AAA, BBB, CCC, // 逆順、つまり降順にソートします。 Arrays.sort( strbufs, new StringBufferReverseComparator() ); for( int iF1 = 0; iF1 < strbufs.length; ++iF1 ) { System.out.print( strbufs[iF1].toString() + ", " ); } System.out.println(); // CCC, BBB, AAA, } } /** * StringBuffer用Comparator。 */ class StringBufferComparator implements Comparator { public int compare( Object lh, Object rh ) { StringBuffer strbufL = (StringBuffer)lh; StringBuffer strbufR = (StringBuffer)rh; // Stringとして取得してそのcompareTo()の結果を // そのまま使用します。 return strbufL.toString().compareTo( strbufR.toString() ); } } /** * StringBuffer用Comparator(逆順)。 */ class StringBufferReverseComparator implements Comparator { public int compare( Object lh, Object rh ) { StringBuffer strbufL = (StringBuffer)lh; StringBuffer strbufR = (StringBuffer)rh; // Stringとして取得してそのcompareTo()の結果を // そのまま使用します。ただし、逆順にするために // マイナスにします。 return - ( strbufL.toString().compareTo( strbufR.toString() ) ); } }