使用 Comparable 和 Comparator 接口对集合排序:
1. 使用 Comparable 接口:
当你希望一个类的对象能够按照某种自然顺序进行排序时,可以实现 Comparable 接口 并重写 compareTo() 方法。
实现步骤:
1.1 实现 Comparable<T> 接口:其中 T 是该类的类型。
1.2 重写 compareTo(T o) 方法:该方法接受一个与当前对象类型相同的参数,并返回一个整数值:
返回值 < 0 :表示当前对象小于传入的参数;
返回值 = 0 :表示当前对象等于传入的参数;
返回值 > 0 :表示当前对象大于传入的参数;
示例代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
// 按年龄升序排列
return Integer.compare(this.age, other.age);
// 如果要降序排列,可以反向比较
// return Integer.compare(other.age, this.age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
Collections.sort(people); // 使用自然顺序排序
System.out.println(people);
}
}
Collections.sort(people);
是真正执行排序操作的语句。当 List<Person>
中的对象实现了 Comparable
接口时,Collections.sort()
方法会使用对象的自然顺序(即 compareTo
方法定义的顺序)来对列表进行排序。
其中 Integer.compare(int x,int y)是Java中的一个静态方法,它根据两个整数的大小关系返回以下值:
返回值 < 0 :表示 x < y ;
返回值 = 0 :表示 x = y ;
返回值 > 0 :表示 x > y ;
2. 使用 Comparator 接口
如果你需要根据不同的标准或在不同场景下对同一类型的对象进行排序,可以实现 Comparator 接口并重写 compare() 方法。
实现步骤:
2.1 实现 Comparator<T> 接口:其中 T 是要比较的对象类型。
2.2 重写 compare(T o1,T o2) 方法:该方法接受两个要比较的对象参数,并返回一个整数值:
返回值 < 0 :表示第一个参数小于第二个参数;
返回值 = 0 :表示第一个参数等于第二个参数;
返回值 > 0 :表示第一个参数大于第二个参数;
示例代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
// 使用自定义比较器按姓名升序排列(匿名内部类)
Comparator<Person> nameComparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
};
Collections.sort(people, nameComparator);
System.out.println("按姓名升序排列: " + people);
// 使用自定义比较器按年龄降序排列(lambda)
Comparator<Person> ageDescendingComparator = (p1, p2) -> Integer.compare(p2.getAge(), p1.getAge());
Collections.sort(people, ageDescendingComparator);
System.out.println("按年龄降序排列: " + people);
}
}
Comparator
定义只是创建了比较器对象,并没有实际执行排序操作。定义 Comparator
只是告诉程序如何比较两个对象,而真正的排序操作需要通过调用排序方法(如 Collections.sort()
或 List.sort()
)来完成。