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 的全部内容。
|