在Java中对一个装着对象的集合进行排序有两种方法:
1. 对象实现Comparable接口
2. 使用Comparator接口
我们定义一个Student对象,包含两个成员:名字name和学号number,实现Comparable接口
public class Student implements Comparable<Student>{
private String name;
private String number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "Student [name=" + name + ", number=" + number + "]";
}
/**
* Comparable接口的compareTo方法
*/
@Override
public int compareTo(Student o) {
//比较两个学生的姓名
return this.name.compareTo(o.getName());
}
}
定义一个Car类,用来展示使用Comparator来对集合进行排序
public class Car {
private String type;
private int price;
public Car(String type, int price) {
this.type = type;
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Car [type=" + type + ", price=" + price + "]";
}
}
定义Comparator的实现类,泛型的参数是Car
public class CarComparator implements Comparator<Car>{
@Override
public int compare(Car car1, Car car2) {
return car1.getType().compareTo(car2.getType());
}
}
public class Test{
public static void main(String[] args) {
List<Student> students = new ArrayList<Student>();
Student student1= new Student("周伯通","2013");
Student student2= new Student("欧阳锋","2014");
Student student3= new Student("郭靖","2015");
Student student4= new Student("黄蓉","2016");
Student student5= new Student("杨过","2017");
Student student6= new Student("小龙女","2018");
students.add(student1);
students.add(student2);
students.add(student3);
students.add(student4);
students.add(student5);
students.add(student6);
//排序前
System.out.println("--------------排序前-----------------");
for(Student student: students){
System.out.println(student.toString());
}
System.out.println();
//排序后
System.out.println("--------------排序后-----------------");
//进行排序
Collections.sort(students);
for(Student student: students){
System.out.println(student.toString());
}
List<Car> cars = new ArrayList<Car>();
Car car1 = new Car("兰博基尼",525);
Car car2 = new Car("玛莎拉蒂",323);
Car car3 = new Car("保时捷",260);
Car car4 = new Car("法拉利",487);
Car car5 = new Car("奥迪",80);
Car car6 = new Car("布加迪威龙",526);
cars.add(car1);
cars.add(car2);
cars.add(car3);
cars.add(car4);
cars.add(car5);
cars.add(car6);
System.out.println();
System.out.println();
System.out.println("---------Comparator的使用-----------");
//排序前
System.out.println("--------------排序前-----------------");
for(Car car: cars){
System.out.println(car.toString());
}
System.out.println();
//排序后
System.out.println("--------------排序后-----------------");
//进行排序
Collections.sort(cars, new CarComparator());
for(Car car: cars){
System.out.println(car.toString());
}
}
}
运行截图:
相对于Comparable,Comparator可以更好地根据情况更改排序的字段,即对哪个属性进行排序。Comparable是一种写死了的形式,每次更改时都需要更改实现了Comparable接口的compareTo方法的方法体。