logo

Java の Comparable と Comparator

Java には、クラスのデータ メンバーを使用してオブジェクトを並べ替えるための 2 つのインターフェイスが用意されています。

  1. 匹敵します
  2. コンパレータ

同等のインターフェイスの使用



比較可能なオブジェクトは、それ自体を別のオブジェクトと比較できます。クラス自体は、 java.lang.Comparable インスタンスを比較するためのインターフェイス。
評価、名前、年などのメンバーを持つ Movie クラスを考えてみましょう。映画のリストを公開年に基づいて並べ替えたいとします。 Movie クラスを使用して Comparable インターフェイスを実装でき、Comparable インターフェイスのメソッド CompareTo() をオーバーライドします。

ジャワ




部分誘導体ラテックス





C# コード例
// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }>

>

>

出力

Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>

ここで、映画を評価と名前でも並べ替えたいとします。 (Comparable を実装することで) コレクション要素を比較できるようにする場合、compareTo() メソッドを実装する機会は 1 回だけです。解決策は使用しています コンパレータ。

コンパレータの使用

Comparable とは異なり、Comparator は比較する要素タイプの外部にあります。別クラスです。異なるメンバーによって比較するために、複数の個別のクラス (Comparator を実装する) を作成します。
Collections クラスには 2 番目の sort() メソッドがあり、Comparator を受け取ります。 sort() メソッドは、compare() を呼び出してオブジェクトを並べ替えます。

映画を評価別に比較するには、次の 3 つのことを行う必要があります。

  1. Comparator (つまり、以前にcompareTo()によって実行されていた作業を実行するcompare()メソッド)を実装するクラスを作成します。
  2. Comparator クラスのインスタンスを作成します。
  3. オーバーロードされた sort() メソッドを呼び出し、Comparator を実装するクラスのリストとインスタンスの両方を指定します。

ジャワ


数学クラスJava



// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) 1 を返します。 それ以外の場合は 0 を返します。 } } // 映画を名前で比較するクラス class NameCompareimplements Comparator { public int Compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // ドライバークラス class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(新しい映画('フォースの覚醒'、8.3、2015)); list.add(新しい映画('スターウォーズ', 8.7, 1977)); list.add( 新しい映画('帝国の逆襲', 8.8, 1980)); list.add( 新しい映画('ジェダイの帰還', 8.4, 1983)); // 評価で並べ替え : (1) // ratingsCompare のオブジェクトを作成します // (2) Collections.sort を呼び出します // (3) 並べ替えられたリストを出力します System.out.println('評価で並べ替え'); RatingCompare 評価比較 = 新しい RatingCompare(); Collections.sort(リスト, 評価比較); for (映画 movie : リスト) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.get Year()); // RatingCompare を使用してオーバーロードされた sort メソッドを呼び出します // (上記と同じ 3 つの手順) System.out.println(' Sorted by name'); NameCompare nameCompare = new NameCompare(); Collections.sort(リスト, nameCompare); for (映画 movie : リスト) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.get Year()); // Comparable を使用して年で並べ替えます System.out.println(' 年で並べ替え'); コレクション.sort(リスト); for (映画 movie : list) System.out.println(movie.get Year() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }>>

>

キャットティンプの体重

>

出力:

Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
  • Comparable は、自然な順序を持つオブジェクトを対象としています。つまり、オブジェクト自体がどのように順序付けされるかを知っている必要があります。たとえば、学生の名簿番号などです。一方、Comparator インターフェイスの並べ替えは別のクラスを通じて行われます。
  • 論理的には、Comparable インターフェイスはこの参照を指定されたオブジェクトと比較し、Java の Comparator は提供された 2 つの異なるクラス オブジェクトを比較します。
  • いずれかのクラスが Java で Comparable インターフェイスを実装している場合、そのオブジェクトの List または Array のコレクションは Collections.sort() または Arrays.sort() メソッドを使用して自動的に並べ替えることができ、オブジェクトは CompareTo メソッドで定義された自然な順序に基づいて並べ替えられます。
  • 基本的な差別化機能は、比較対象を使用すると比較が 1 つだけできることです。一方、特定の型に対して必要に応じて、並べ替えの意味について異なる解釈を使用して複数のカスタム コンパレーターを作成できます。比較可能な例と同様に、1 つの属性 (年) だけで並べ替えることができますが、コンパレータでは、評価、名前、年などの異なる属性も使用できました。

要約すると、オブジェクトの並べ替えを自然順序に基づいて行う必要がある場合は Comparable を使用し、異なるオブジェクトの属性に基づいて並べ替えを行う必要がある場合は Java の Comparator を使用します。