logo

Java のコンパレータ インターフェイスと例

コンパレータ インターフェイスは、ユーザー定義クラスのオブジェクトを順序付けるために使用されます。コンパレータ オブジェクトは、同じクラスの 2 つのオブジェクトを比較できます。 次の関数は、obj1 と obj2 を比較します。

構文:

public int compare(Object obj1, Object obj2):>

ロール番号、名前、住所、DOB などのフィールドを含む独自のクラス タイプの Array/ArrayList があり、ロール番号または名前に基づいて配列を並べ替える必要があるとします。



方法 1 : 明らかなアプローチの 1 つは、標準アルゴリズムの 1 つを使用して独自の sort() 関数を作成することです。このソリューションでは、ロール番号や名前などのさまざまな基準に合わせて並べ替えコード全体を書き直す必要があります。

C++で優先キュー

方法 2: コンパレータ インターフェイスの使用 - コンパレータ インターフェイスは、ユーザー定義クラスのオブジェクトを順序付けるために使用されます。このインターフェイスは java.util パッケージに存在し、compare(Object obj1, Object obj2) とquals(Object element) の 2 つのメソッドが含まれています。コンパレータを使用すると、データ メンバーに基づいて要素を並べ替えることができます。たとえば、名簿番号、名前、年齢、その他何でも構いません。

List 要素を並べ替えるための Collections クラスのメソッドは、指定されたコンパレータによって List の要素を並べ替えるために使用されます。

public void sort(List list, ComparatorClass c)>

特定の List を並べ替えるには、ComparatorClass は Comparator インターフェイスを実装する必要があります。

Collections クラスの sort() メソッドはどのように機能しますか?

内部的には、Sort メソッドは、並べ替えているクラスの Compare メソッドを呼び出します。 2 つの要素を比較するには、「どちらが大きいですか?」と尋ねます。 Compare メソッドは -1、0、または 1 を返し、他方より小さいか等しいか大きいかを示します。この結果を使用して、並べ替えのためにそれらを交換する必要があるかどうかを判断します。

ジャワ




// Java Program to Demonstrate Working of> // Comparator Interface> // Importing required classes> import> java.io.*;> import> java.lang.*;> import> java.util.*;> // Class 1> // A class to represent a Student> class> Student {> >// Attributes of a student> >int> rollno;> >String name, address;> >// Constructor> >public> Student(>int> rollno, String name, String address)> >{> >// This keyword refers to current instance itself> >this>.rollno = rollno;> >this>.name = name;> >this>.address = address;> >}> >// Method of Student class> >// To print student details in main()> >public> String toString()> >{> >// Returning attributes of Student> >return> this>.rollno +>' '> +>this>.name +>' '> >+>this>.address;> >}> }> // Class 2> // Helper class implementing Comparator interface> class> Sortbyroll>implements> Comparator {> >// Method> >// Sorting in ascending order of roll number> >public> int> compare(Student a, Student b)> >{> >return> a.rollno - b.rollno;> >}> }> // Class 3> // Helper class implementing Comparator interface> class> Sortbyname>implements> Comparator {> >// Method> >// Sorting in ascending order of name> >public> int> compare(Student a, Student b)> >{> >return> a.name.compareTo(b.name);> >}> }> // Class 4> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating an empty ArrayList of Student type> >ArrayList ar =>new> ArrayList();> >// Adding entries in above List> >// using add() method> >ar.add(>new> Student(>111>,>'Mayank'>,>'london'>));> >ar.add(>new> Student(>131>,>'Anshul'>,>'nyc'>));> >ar.add(>new> Student(>121>,>'Solanki'>,>'jaipur'>));> >ar.add(>new> Student(>101>,>'Aggarwal'>,>'Hongkong'>));> >// Display message on console for better readability> >System.out.println(>'Unsorted'>);> >// Iterating over entries to print them> >for> (>int> i =>0>; i System.out.println(ar.get(i)); // Sorting student entries by roll number Collections.sort(ar, new Sortbyroll()); // Display message on console for better readability System.out.println(' Sorted by rollno'); // Again iterating over entries to print them for (int i = 0; i System.out.println(ar.get(i)); // Sorting student entries by name Collections.sort(ar, new Sortbyname()); // Display message on console for better readability System.out.println(' Sorted by name'); // // Again iterating over entries to print them for (int i = 0; i System.out.println(ar.get(i)); } }>

>

>

出力

Unsorted 111 Mayank london 131 Anshul nyc 121 Solanki jaipur 101 Aggarwal Hongkong Sorted by rollno 101 Aggarwal Hongkong 111 Mayank london 121 Solanki jaipur 131 Anshul nyc Sorted by name 101 Aggarwal Hongkong 131 Anshul nyc 111 Mayank london 121 Solanki jaipur>

比較メソッド内の戻り値を変更することで、希望する順序で並べ替えることができます。たとえば、降順の場合は、上記の比較メソッドの「a」と「b」の位置を変更するだけです。

コレクションを複数のフィールドで並べ替える

前の例では、Comparable および Comparator インターフェイスを使用して単一のフィールドに基づいてオブジェクトのリストを並べ替える方法について説明しました。しかし、最初に次のように、複数のフィールドに従って ArrayList オブジェクトを並べ替える必要がある場合はどうなるでしょうか。 1 つ目は学生の名前に従って並べ替え、2 つ目は学生の年齢に従って並べ替えます。

ジャワ




// Java Program to Demonstrate Working of> // Comparator Interface Via More than One Field> // Importing required classes> import> java.util.ArrayList;> import> java.util.Collections;> import> java.util.Comparator;> import> java.util.Iterator;> import> java.util.List;> // Class 1> // Helper class representing a Student> class> Student {> >// Attributes of student> >String Name;> >int> Age;> >// Parameterized constructor> >public> Student(String Name, Integer Age)> >{> >// This keyword refers to current instance itself> >this>.Name = Name;> >this>.Age = Age;> >}> >// Getter setter methods> >public> String getName() {>return> Name; }> >public> void> setName(String Name) {>this>.Name = Name; }> >public> Integer getAge() {>return> Age; }> >public> void> setAge(Integer Age) {>this>.Age = Age; }> >// Method> >// Overriding toString() method> >@Override> public> String toString()> >{> >return> 'Customer{'> >+>'Name='> + Name +>', Age='> + Age +>'}'>;> >}> }> // Class 2> // Helper class implementing Comparator interface> class> CustomerSortingComparator> >implements> Comparator {> >// Method 1> >// To compare customers> >@Override> >public> int> compare(Student customer1, Student customer2)> >{> >// Comparing customers> >int> NameCompare = customer1.getName().compareTo(> >customer2.getName());> >int> AgeCompare = customer1.getAge().compareTo(> >customer2.getAge());> >// 2nd level comparison> >return> (NameCompare ==>0>) ? AgeCompare> >: NameCompare;> >}> }> // Method 2> // Main driver method> class> GFG {> >public> static> void> main(String[] args)> >{> >// Create an empty ArrayList> >// to store Student> >List al =>new> ArrayList();> >// Create customer objects> >// using constructor initialization> >Student obj1 =>new> Student(>'Ajay'>,>27>);> >Student obj2 =>new> Student(>'Sneha'>,>23>);> >Student obj3 =>new> Student(>'Simran'>,>37>);> >Student obj4 =>new> Student(>'Ajay'>,>22>);> >Student obj5 =>new> Student(>'Ajay'>,>29>);> >Student obj6 =>new> Student(>'Sneha'>,>22>);> >// Adding customer objects to ArrayList> >// using add() method> >al.add(obj1);> >al.add(obj2);> >al.add(obj3);> >al.add(obj4);> >al.add(obj5);> >al.add(obj6);> >// Iterating using Iterator> >// before Sorting ArrayList> >Iterator custIterator = al.iterator();> >// Display message> >System.out.println(>'Before Sorting: '>);> >// Holds true till there is single element> >// remaining in List> >while> (custIterator.hasNext()) {> >// Iterating using next() method> >System.out.println(custIterator.next());> >}> >// Sorting using sort method of Collections class> >Collections.sort(al,> >new> CustomerSortingComparator());> >// Display message only> >System.out.println(>' After Sorting: '>);> >// Iterating using enhanced for-loop> >// after Sorting ArrayList> >for> (Student customer : al) {> >System.out.println(customer);> >}> >}> }>

>

PVR 完全形式
>

出力

Before Sorting: Customer{Name=Ajay, Age=27} Customer{Name=Sneha, Age=23} Customer{Name=Simran, Age=37} Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=29} Customer{Name=Sneha, Age=22} After Sorting: Customer{Name=Ajay, Age=22} Customer{Name=Ajay, Age=27} Customer{Name=Ajay, Age=29} Customer{Name=Simran, Age=37} Customer{Name=Sneha, Age=22} Customer{Name=Sneha, Age=23}>