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);
	}
}
Java 如何对象数组列表进行排序

演示类- Employee

我们使用下面的Employee类来进行演示,它有四个字段:idfirstNamelastNameage

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