JavaA2Z

KAB-studio > プログラミング > JavaA2Z > Comparatorとは

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()メソッドを使用することにかわりはなく、故に修正マージソートソートされることになる。ソートの方法は全く変えることなく、比較方法だけをコントロールするための方法が、このインターフェイスを利用することの大きなメリットである。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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() );
        forint iF1 = 0; iF1 < strbufs.length; ++iF1 )
        {
            System.out.print( strbufs[iF1].toString() + ", " );
        }
        System.out.println();
        // AAA, BBB, CCC, 

        // 逆順、つまり降順にソートします。
        Arrays.sort( strbufs, new StringBufferReverseComparator() );
        forint 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() ) );
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/04/05
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。