📅  最后修改于: 2023-12-03 15:02:02.894000             🧑  作者: Mango
在Java中,我们经常需要按照某种规则进行对象排序。比如要根据数字的大小或字符串的字典序来排序。Java提供了一种方便的方式来实现对象的比较,就是使用比较器。
比较器是一个实现了Comparator接口的对象,它可以用来比较两个对象的大小。在Java的标准库中,有一个专门用来排序的类叫做Collections,它提供了sort()方法来对一个List中的元素进行排序,但是需要我们提供一个比较器。通过指定不同的比较器,我们可以得到不同的排序结果。
Java中的比较器有两种,一种是实现了Comparable接口的类的自然排序,另一种是实现了Comparator接口的比较器。Comparator接口有一个常用的方法叫做thenComparingDouble(),它可以用来实现多关键字的排序。
thenComparingDouble()方法是Comparator接口中的一个方法,它的作用是返回一个比较器,该比较器首先按照指定的Comparator进行比较,如果前一个比较器认为两个对象是相等的,则再根据给定的函数式接口DoubleFunction计算出两个对象的双精度浮点数值,从而再次进行判断大小的比较。
该方法的函数签名如下:
public default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
其中,T是被比较的对象类型。
下面是一个示例,我们将使用一个Person类来演示thenComparingDouble()方法的使用。Person类有name和age两个字段,我们希望先按照name进行字典序排序,如果name相同,则按照age从小到大排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.ToDoubleFunction;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", 20));
persons.add(new Person("Bob", 25));
persons.add(new Person("Catherine", 30));
persons.add(new Person("David", 30));
persons.add(new Person("Emily", 35));
// 按名字排序
Comparator<Person> byName = Comparator.comparing(Person::getName);
// 如果名字相同,则按年龄从小到大排序
Comparator<Person> byAge = Comparator.comparingInt(Person::getAge);
Comparator<Person> byNameAndAge = byName.thenComparingDouble(person -> person.getAge());
Collections.sort(persons, byNameAndAge);
for (Person person : persons) {
System.out.println(person.getName() + " " + person.getAge());
}
}
}
输出结果如下:
Alice 20
Bob 25
Catherine 30
David 30
Emily 35
从上面的结果来看,我们首先按照name进行了排序,如果name相同,则按照age从小到大排序。这就是thenComparingDouble()方法的作用。