Java 8 中的比较器
使用 Lambda ,使得Comparator更简单
List<Employee> employees = getEmployeesFromDB(); // 根据姓名排序 employees.sort(Comparator.comparing(e -> e.getFirstName())); // 还可以这样写 employees.sort(Comparator.comparing(Employee::getFirstName)); // 倒序排序 Comparator<Employee> comparator = Comparator.comparing(e -> e.getFirstName()); employees.sort(comparator.reversed()); // 多个字段排序 Comparator<Employee> groupByComparator = Comparator.comparing(Employee::getFirstName).thenComparing(Employee::getLastName); employees.sort(groupByComparator);
Java 使用Comparable对对象数组排序
Comparable接口提供了一种方法 compareTo(T o) 在任何类中实现,以便可以比较该类的两个实例。
方法语法是:
public int compareTo(T o);
这里,在要比较的两个实例中,一个是将调用方法的实例本身,另一个作为参数传递。
让我们看看我们的 Employee 类在实现了 Comparable 接口后会是什么样子。
package corejava.compare;
public class Employee implements Comparable<Employee> {
private int id = -1;
private String firstName = null;
private String lastName = null;
private int age = -1;
public Employee(int id, String fName, String lName, int age) {
this.id = id;
this.firstName = fName;
this.lastName = lName;
this.age = age;
}
@Override
public int compareTo(Employee o) {
return this.id - o.id;
}
// Setters and Getters
@Override
public String toString() {
return "Employee : " + id + " - " + firstName + " - " + lastName + " - " + age + "\n";
}
}
在我们的例子中,对员工列表进行排序的默认方式是通过他们的 id。
在实现的 compare()方法中,我们简单地返回了两个实例的员工 ID 的差异。
两个相等的员工 ID 将返回零,表示同一个对象。
Collections.sort()
让我们测试在上面的 Employee 类中实现的 compare() 方法。
package corejava.compare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestSorting {
public static void main(String[] args) {
Employee e1 = new Employee(1, "aTestName", "dLastName", 34);
Employee e2 = new Employee(2, "nTestName", "pLastName", 30);
Employee e3 = new Employee(3, "kTestName", "sLastName", 31);
Employee e4 = new Employee(4, "dTestName", "zLastName", 25);
List<Employee> employees = new ArrayList<Employee>();
employees.add(e2);
employees.add(e3);
employees.add(e1);
employees.add(e4);
// UnSorted List
System.out.println(employees);
Collections.sort(employees);
// Default Sorting by employee id
System.out.println(employees);
}
}
演示类- Employee
我们使用下面的Employee类来进行演示,它有四个字段:id、firstName、lastName和 age。
package corejava.compare;
public class Employee {
private int id = -1;
private String firstName = null;
private String lastName = null;
private int age = -1;
public Employee(int id, String fName, String lName, int age) {
this.id = id;
this.firstName = fName;
this.lastName = lName;
this.age = age;
}
// Setters and Getters
@Override
public String toString() {
return "Employee : " + id + " - " + firstName + " - " + lastName
+ " - " + age + "n";
}
}
查看更多教程 https://on itroad.com
Java 使用Comparator对对象数组排序
Comparator接口可用于在某些特定基础上对实例集合进行排序。
要对不同的字段进行排序,我们需要多个 Comparator 实现。
Comparator接口示例
下面是不同的排序方法示例
根据名字排序
package corejava.compare;
import java.util.Comparator;
public class FirstNameSorter implements Comparator<Employee>{
@Override
public int compare(Employee o1, Employee o2) {
return o1.getFirstName().compareTo(o2.getFirstName());
}
}
根据年龄排序
package corejava.compare;
import java.util.Comparator;
public class AgeSorter implements Comparator<Employee> {
@Override
public int compare(Employee o1, Employee o2) {
return o1.getAge() - o2.getAge();
}
}
如何使用 Comparator 进行比较
package corejava.compare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestSorting
{
public static void main(String[] args)
{
Employee e1 = new Employee(1, "aTestName", "dLastName", 34);
Employee e2 = new Employee(2, "nTestName", "pLastName", 30);
Employee e3 = new Employee(3, "kTestName", "sLastName", 31);
Employee e4 = new Employee(4, "dTestName", "zLastName", 25);
List<Employee> employees = new ArrayList<Employee>();
employees.add(e2);
employees.add(e3);
employees.add(e1);
employees.add(e4);
System.out.println(employees);
// 默认根据id排序
Collections.sort(employees);
System.out.println(employees);
// 根据名字排序
Collections.sort(employees, new FirstNameSorter());
System.out.println(employees);
// 根据年龄排序
Collections.sort(employees, new AgeSorter());
System.out.println(employees);
}
}
日期:2020-09-17 00:09:27 来源:oir作者:oir
