第四章 java中的Comparator


Comparator

当你想对一个类的对象列表进行排序时,可以使用 Comparator 接口。您不需要在对象需要排序的类上实现 Comparator。您可以创建一个单独的类并实现 Comparator 接口,如下所示。

例如:

package com.arpit.java2blog;

import java.util.Comparator;

public class EmployeeSortByIdComparator implements Comparator{

    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.getEmpId()-e2.getEmpId();
    }
}

您可以根据需要排序的对象的不同属性使用不同的排序逻辑。

例如: 假设您想按姓名对员工列表进行排序,您可以使用下面的 ocde 来做到这一点。

Employee e1= new Employee(4, "John", 20);
        Employee e2= new Employee(3, "Martin", 40);
        Employee e3= new Employee(1, "Mary", 28);
        Employee e4= new Employee(2, "Andrew", 35);

        List<Employee> listofEmployees=new ArrayList<>();
        listofEmployees.add(e1);
        listofEmployees.add(e2);
        listofEmployees.add(e3);
        listofEmployees.add(e4);

        System.out.println("Before Sorting by name: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }

        Collections.sort(listofEmployees,new Comparator<Employee>() {

            @Override
            public int compare(Employee o1, Employee o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("After Sorting by name: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }

比较器的 Java 代码:

创建一个名为 Employee.java 的类,该类将包含 empId、name 和 age。

1.Employee.java

package com.arpit.java2blog;

public class Employee {
    private int empId;
    private String name;
    private int age;
    public Employee(int empId, String name, int age) {
        super();
        this.empId = empId;
        this.name = name;
        this.age = age;
    }
    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    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;
    }
}

创建一个名为“EmployeeSortByIdComparator”的类。此类将具有按 empId 对员工列表进行排序的逻辑。 2.EmployeeSortByIdComparator.java

package com.arpit.java2blog;

import java.util.Comparator;

public class EmployeeSortByIdComparator implements Comparator{

    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.getEmpId()-e2.getEmpId();
    }
}

让我们创建一个主类,它具有创建对象列表并根据 empId 对其进行排序的逻辑。

3.EmployeeComparatorMain.java

package com.arpit.java2blog;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class EmployeeComparatorMain {

    public static void main(String[] args) {
        Employee e1= new Employee(4, "John", 20);
        Employee e2= new Employee(3, "Martin", 40);
        Employee e3= new Employee(1, "Mary", 28);
        Employee e4= new Employee(2, "Andrew", 35);

        List<Employee> listofEmployees=new ArrayList<>>();
        listofEmployees.add(e1);
        listofEmployees.add(e2);
        listofEmployees.add(e3);
        listofEmployees.add(e4);

        System.out.println("Before Sorting by empId: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }

        Collections.sort(listofEmployees,new EmployeeSortByIdComparator());
        System.out.println("After Sorting by empId: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }
    }
}

输出:

Before Sorting by empId: 
Employee Id: 4|| name: John
Employee Id: 3|| name: Martin
Employee Id: 1|| name: Mary
Employee Id: 2|| name: Andrew
After Sorting by empId: 
Employee Id: 1|| name: Mary
Employee Id: 2|| name: Andrew
Employee Id: 3|| name: Martin
Employee Id: 4|| name: John

匿名比较器:

Comparator 优于可比较的优点之一是您可以创建匿名比较器,即您不需要为对象需要排序的类实现 Comparable 接口。 让我们通过示例来了解更多: 我们将使用匿名类按名称对员工列表进行排序。

ComparatorMain.java

package com.arpit.java2blog;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class EmployeeComparatorMain {

    public static void main(String[] args) {
        Employee e1= new Employee(4, "John", 20);
        Employee e2= new Employee(3, "Martin", 40);
        Employee e3= new Employee(1, "Mary", 28);
        Employee e4= new Employee(2, "Andrew", 35);

        List<Employee> listofEmployees=new ArrayList<>>();
        listofEmployees.add(e1);
        listofEmployees.add(e2);
        listofEmployees.add(e3);
        listofEmployees.add(e4);

        System.out.println("Before Sorting by name: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }

        Collections.sort(listofEmployees,new Comparator<Employee>() {

            @Override
            public int compare(Employee o1, Employee o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("After Sorting by name: ");
        for (Employee e:listofEmployees) {
            System.out.println("Employee Id: "+e.getEmpId()+"|| name: "+e.getName());
        }
    }
}

输出:

Before Sorting by name: 
Employee Id: 4|| name: John
Employee Id: 3|| name: Martin
Employee Id: 1|| name: Mary
Employee Id: 2|| name: Andrew
After Sorting by name: 
Employee Id: 2|| name: Andrew
Employee Id: 4|| name: John
Employee Id: 3|| name: Martin
Employee Id: 1|| name: Mary

正如您在此处看到的,我们使用匿名比较器按姓名对员工列表进行排序。我们没有在这里创建比较器特定的类。 这就是 Java 中的 Comparator 的全部内容。


原文链接:https://codingdict.com/