当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Comparator Interface用法及代码示例


比较器接口用于对用户定义类的对象进行排序。比较器对象能够比较同一类的两个对象。以下函数将 obj1 与 obj2 进行比较。

用法:

public int compare(Object obj1, Object obj2):

假设我们有一个自己的类类型的Array/ArrayList,包含卷号、名称、地址、出生日期等字段,并且我们需要根据卷号或名称对数组进行排序?

方法 1:一种明显的方法是使用一种标准算法编写我们自己的 sort() 函数。该解决方案需要针对不同的标准(例如卷号和名称)重写整个排序代码。

方法2:使用比较器接口 - Comparator 接口用于对用户定义类的对象进行排序。该接口存在于java.util包中,包含2个方法compare(Object obj1, Object obj2)和equals(Object element)。使用比较器,我们可以根据数据成员对元素进行排序。例如,它可能是卷号、姓名、年龄或其他任何内容。

Collections 类对 List 元素进行排序的方法用于通过给定的比较器对 List 的元素进行排序。

public void sort(List list, ComparatorClass c)

要对给定列表进行排序,ComparatorClass 必须实现 Comparator 接口。

Collections 类的sort() 方法如何工作?

在内部,Sort 方法确实调用它正在排序的类的 Compare 方法。为了比较两个元素,它会问“哪个更大?” Compare 方法返回 -1、0 或 1 来表示它是否小于、等于或大于另一个。然后它使用这个结果来确定是否应该交换它们的排序。

示例

Java


// 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<Student> {
    // 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<Student> {
    // 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<Student> ar = new ArrayList<Student>();
        // 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 < ar.size(); 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("\nSorted by rollno");
        // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); 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("\nSorted by name");
        // // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); 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’ 的位置即可。

Sort collection by more than one field

在前面的示例中,我们讨论了如何使用 Comparable 和 Comparator 接口根据单个字段对对象列表进行排序但是,如果我们需要根据多个字段对 ArrayList 对象进行排序,例如首先,根据学生姓名排序;其次,根据学生年龄排序。

示例

Java


// 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<Student> {
    // 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<Student> 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<Student> custIterator = al.iterator();
        // Display message
        System.out.println("Before Sorting:\n");
        // 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("\n\nAfter Sorting:\n");
        // Iterating using enhanced for-loop
        // after Sorting ArrayList
        for (Student customer : al) {
            System.out.println(customer);
        }
    }
}
输出
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}


相关用法


注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Comparator Interface in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。