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