logo

Java コンパレータ インターフェイス

Java コンパレータ インターフェイス ユーザー定義クラスのオブジェクトを順序付けるために使用されます。

このインターフェイスは java.util パッケージ内にあり、compare(Object obj1,Object obj2) およびquals(Object element) の 2 つのメソッドが含まれています。

複数の並べ替えシーケンスが提供されます。つまり、ロール番号、名前、年齢など、任意のデータ メンバーに基づいて要素を並べ替えることができます。

Java コンパレータ インターフェイスのメソッド

方法説明
public int Compare(オブジェクト obj1, オブジェクト obj2)最初のオブジェクトと 2 番目のオブジェクトを比較します。
public booleanquals(Object obj)現在のオブジェクトと指定されたオブジェクトを比較するために使用されます。
public booleanquals(Object obj)現在のオブジェクトと指定されたオブジェクトを比較するために使用されます。

コレクションクラス

コレクション クラスは、コレクションの要素を並べ替えるための静的メソッドを提供します。コレクション要素が Set または Map の場合、TreeSet または TreeMap を使用できます。ただし、List の要素を並べ替えることはできません。 Collections クラスは、List 型要素の要素を並べ替えるメソッドも提供します。

List要素をソートするためのCollectionsクラスのメソッド

public void sort(リストリスト、コンパレータc): 指定されたコンパレーターによってリストの要素をソートするために使用されます。


Java コンパレータの例 (非汎用の古いスタイル)

List の要素を年齢と名前に基づいて並べ替える例を見てみましょう。この例では、4 つの Java クラスを作成しました。

  1. Student.java
  2. AgeComparator.java
  3. NameComparator.java
  4. シンプル.java
Student.java

このクラスには、rollno、name、age の 3 つのフィールドと、パラメーター化されたコンストラクターが含まれています。

 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java

このクラスは、年齢に基づいた比較ロジックを定義します。最初のオブジェクトの経過時間が 2 番目のオブジェクトよりも大きい場合は、正の値を返します。 1、2、10 などの任意の値を指定できます。最初のオブジェクトの年齢が 2 番目のオブジェクトより小さい場合、負の値が返されます。負の値は任意であり、両方のオブジェクトの年齢が等しい場合は、 0を返します。

 import java.util.*; class AgeComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

このクラスは、名前に基づいた比較ロジックを提供します。このような場合、内部的に比較ロジックを提供する String クラスの CompareTo() メソッドを使用します。

 import java.util.*; class NameComparator implements Comparator{ public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; return s1.name.compareTo(s2.name); } } 
シンプル.java

このクラスでは、名前と年齢に基づいてソートしてオブジェクトの値を出力します。

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); Iterator itr=al.iterator(); while(itr.hasNext()){ Student st=(Student)itr.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); Iterator itr2=al.iterator(); while(itr2.hasNext()){ Student st=(Student)itr2.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Java コンパレータの例 (汎用)

Student.java
 class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } 
AgeComparator.java
 import java.util.*; class AgeComparator implements Comparator{ public int compare(Student s1,Student s2){ if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } 
NameComparator.java

このクラスは、名前に基づいた比較ロジックを提供します。このような場合、内部的に比較ロジックを提供する String クラスの CompareTo() メソッドを使用します。

 import java.util.*; class NameComparator implements Comparator{ public int compare(Student s1,Student s2){ return s1.name.compareTo(s2.name); } } 
シンプル.java

このクラスでは、名前と年齢に基づいてソートしてオブジェクトの値を出力します。

 import java.util.*; import java.io.*; class Simple{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); System.out.println('Sorting by Name'); Collections.sort(al,new NameComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } System.out.println('Sorting by age'); Collections.sort(al,new AgeComparator()); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Java 8 コンパレータ インターフェイス

Java 8 Comparator インターフェースは、抽象メソッドを 1 つだけ含む関数インターフェースです。これで、Comparator インターフェイスをラムダ式またはメソッド参照の代入ターゲットとして使用できるようになりました。

Java 8 コンパレータ インターフェイスのメソッド

方法説明
int 比較(T o1, To2)最初のオブジェクトと 2 番目のオブジェクトを比較します。
静的コンパレータ比較(ファンクションキー抽出)これは、型 T から Comparable ソート キーを抽出する関数を受け取り、そのソート キーによって比較する Comparator を返します。
静的コンパレータ比較(Function keyExtractor, Comparator keyComparator)これは、型 T からソート キーを抽出する関数を受け入れ、指定された Comparator を使用してそのソート キーによって比較する Comparator を返します。
静的コンパレータcomparatorDouble(ToDoubleFunction keyExtractor)これは、型 T から二重ソート キーを抽出する関数を受け入れ、そのソート キーによって比較する Comparator を返します。
静的コンパレータ CompareInt(ToIntFunction keyExtractor)これは、型 T から int ソート キーを抽出する関数を受け取り、そのソート キーで比較する Comparator を返します。
静的コンパレータcomparingLong(ToLongFunction keyExtractor)これは、型 T から長いソート キーを抽出する関数を受け入れ、そのソート キーによって比較する Comparator を返します。
ブール値等しい(オブジェクトobj)現在のオブジェクトと指定されたオブジェクトを比較するために使用されます。
静的コンパレータnaturalOrder()Comparable オブジェクトを自然な順序で比較するコンパレータを返します。
静的コンパレータ nullsFirst(コンパレータ コンパレータ)null を非 null 要素より小さいものとして扱うコンパレータを返します。
静的コンパレータ nullsLast(コンパレータ コンパレータ)null を null 以外の要素よりも大きいものとして扱うコンパレータを返します。
デフォルトのコンパレータ reversed()指定されたコンパレータの逆の順序を含むコンパレータを返します。
静的コンパレータ reverseOrder()自然な順序の逆を含むコンパレータを返します。
デフォルトのコンパレータ thenComparing(コンパレータ other)辞書順のコンパレータと別のコンパレータを返します。
デフォルトコンパレータ thenComparing(ファンクションキー抽出)Comparable ソート キーを抽出する関数を備えた辞書順コンパレータを返します。
デフォルトのコンパレータ thenComparing(ファンクション keyExtractor, コンパレータ keyComparator)指定された Comparator と比較するキーを抽出する関数を備えた辞書編集順のコンパレータを返します。
デフォルトのコンパレータ thenComparingDouble(ToDoubleFunction keyExtractor)二重ソートキーを抽出する関数を備えた辞書順コンパレータを返します。
デフォルトのコンパレータ thenComparingInt(ToIntFunction keyExtractor)int ソート キーを抽出する関数を含む辞書順コンパレーターを返します。
デフォルトのコンパレータ thenComparingLong(ToLongFunction keyExtractor)長いソートキーを抽出する関数を備えた辞書順コンパレータを返します。

Java 8 コンパレータの例

List の要素を年齢と名前に基づいて並べ替える例を見てみましょう。

ファイル: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

ファイル: TestSort1.java

 import java.util.*; public class TestSort1{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,'Jai',21)); //Sorting elements on the basis of name Comparator cm1=Comparator.comparing(Student::getName); Collections.sort(al,cm1); System.out.println('Sorting by Name'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } //Sorting elements on the basis of age Comparator cm2=Comparator.comparing(Student::getAge); Collections.sort(al,cm2); System.out.println('Sorting by Age'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23 Sorting by Age 105 Jai 21 101 Vijay 23 106 Ajay 27 

Java 8 コンパレータの例: nullsFirst() メソッドと nullsLast() メソッド

ここでは、null も含まれる要素のリストを並べ替えます。

ファイル: Student.java

 class Student { int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } public int getRollno() { return rollno; } public void setRollno(int rollno) { this.rollno = rollno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 

ファイル: TestSort2.java

 import java.util.*; public class TestSort2{ public static void main(String args[]){ ArrayList al=new ArrayList(); al.add(new Student(101,'Vijay',23)); al.add(new Student(106,'Ajay',27)); al.add(new Student(105,null,21)); Comparator cm1=Comparator.comparing(Student::getName,Comparator.nullsFirst(String::compareTo)); Collections.sort(al,cm1); System.out.println('Considers null to be less than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } Comparator cm2=Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)); Collections.sort(al,cm2); System.out.println('Considers null to be greater than non-null'); for(Student st: al){ System.out.println(st.rollno+' '+st.name+' '+st.age); } } } 
 Considers null to be less than non-null 105 null 21 106 Ajay 27 101 Vijay 23 Considers null to be greater than non-null 106 Ajay 27 101 Vijay 23 105 null 21