📜  Java比较器接口与示例

📅  最后修改于: 2020-04-05 12:32:36             🧑  作者: Mango

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

public int compare(Object obj1, Object obj2):

假设我们有自己类型的数组/数组列表,其中包含诸如rollno,name,address,DOB等字段,我们需要根据Roll no或name对数组进行排序
方法1:一种显而易见的方法是使用一种标准算法编写我们自己的sort()函数。该解决方案需要针对不同的标准(如纸卷编号和名称)重写整个分类代码。
方法2:使用比较器接口:比较器接口用于对用户定义类的对象进行排序。此接口存在于java.util包中,包含2个方法compare(Object obj1,Object obj2)和equals(Object元素)。使用比较器,我们可以根据数据成员对元素进行排序。例如,它可能在rollno,名称,年龄或其他任何内容上。
用于对List元素进行排序的Collections类的方法用于通过给定的比较器对List的元素进行排序。

// 排序给定list, ComparatorClass必须实现
// Comparator接口
public void sort(List list, ComparatorClass c)

Collections.Sort()如何工作?
在内部,Sort方法确实调用要排序的类的Compare方法。为了比较两个元素,它询问“哪个更大?” Compare方法返回-1、0或1以表示它小于,等于或大于另一个。它使用此结果来确定是否应将其交换用于其排序。
工作程序:

// Java展示Comparator接口

import java.util.*;
import java.lang.*;
import java.io.*;
// 一个代表学生的类
class Student
{
    int rollno;
    String name, address;
    // 构造函数
    public Student(int rollno, String name,
                               String address)
    {
        this.rollno = rollno;
        this.name = name;
        this.address = address;
    }
    // 在main()当中打印学生的详情
    public String toString()
    {
        return this.rollno + " " + this.name +
                           " " + this.address;
    }
}
class Sortbyroll implements Comparator
{
    // 对roll number进行升序排序
    public int compare(Student a, Student b)
    {
        return a.rollno - b.rollno;
    }
}
class Sortbyname implements Comparator
{
    // 对roll name进行升序排序
    public int compare(Student a, Student b)
    {
        return a.name.compareTo(b.name);
    }
}
// 测试类
class Main
{
    public static void main (String[] args)
    {
        ArrayList ar = new ArrayList();
        ar.add(new Student(111, "bbbb", "london"));
        ar.add(new Student(131, "aaaa", "nyc"));
        ar.add(new Student(121, "cccc", "jaipur"));
        System.out.println("无须");
        for (int i=0; i

输出:

无须
111 bbbb london
131 aaaa nyc
121 cccc jaipur
根据rollno排序
111 bbbb london
121 cccc jaipur
131 aaaa nyc
根据name排序
131 aaaa nyc
111 bbbb london
121 cccc jaipu

通过在内部compare方法中更改返回值,您可以按所需的任何顺序排序。例如,对于降序,只需在上述比较方法中更改a和b的位置即可。

按多个字段对集合进行排序

在前几篇文章中,我们讨论了如何使用Comparable和Comparator接口在单个字段的基础上对对象列表进行排序,但是,如果我们需要根据多个字段对ArrayList对象进行排序
下面是上述方法的实现:

// Java程序展示Comparator接口对多个字段进行排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Comparator;
class Student {
    // 对象变量
    String Name;
    int Age;
    // 参数化构造函数
    public Student(String Name, Integer Age) {
        this.Name = Name;
        this.Age = Age;
    }
    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;
    }
    // 重写toString()方法
    @Override
    public String toString() {
        return "Customer{" + "姓名=" + Name + ", 年龄=" + Age + '}';
    }
    static class CustomerSortingComparator implements Comparator {
        @Override
        public int compare(Student customer1, Student customer2) {
            // 比较
            int NameCompare = customer1.getName().compareTo(customer2.getName());
            int AgeCompare = customer1.getAge().compareTo(customer2.getAge());
            // 使用if-else块进行第二层面的比较
            if (NameCompare == 0) {
                return ((AgeCompare == 0) ? NameCompare : AgeCompare);
            } else {
                return NameCompare;
            }
        }
    }
    public static void main(String[] args) {
        // 创建ArrayList来存储学生信息
        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);
        // 把当前对象加入ArrayList
        al.add(obj1);
        al.add(obj2);
        al.add(obj3);
        al.add(obj4);
        al.add(obj5);
        al.add(obj6);
        // 在排序前 
        Iterator custIterator = al.iterator();
        System.out.println("排序前:\n");
        while (custIterator.hasNext()) {
            System.out.println(custIterator.next());
        }
        // 使用Collections.sort(al, comparator)排序
        Collections.sort(al, new CustomerSortingComparator());
        // 在排序后
        System.out.println("\n\n排序后:\n");
        for (Student customer : al) {
            System.out.println(customer);
        }
    }
}

输出:

排序前:
Customer{姓名=Ajay, 年龄=27}
Customer{姓名=Sneha, 年龄=23}
Customer{姓名=Simran, 年龄=37}
Customer{姓名=Ajay, 年龄=22}
Customer{姓名=Ajay, 年龄=29}
Customer{姓名=Sneha, 年龄=22}
排序后:
Customer{姓名=Ajay, 年龄=22}
Customer{姓名=Ajay, 年龄=27}
Customer{姓名=Ajay, 年龄=29}
Customer{姓名=Simran, 年龄=37}
Customer{姓名=Sneha, 年龄=22}
Customer{姓名=Sneha, 年龄=23}