MST

星途 面试题库

面试题:Java Collections排序中如何自定义比较器

在Java的`Collections`框架中,当对一个`List`进行排序时,如果默认的自然排序不符合需求,需要自定义比较逻辑。请阐述如何通过实现`Comparator`接口来创建自定义比较器,并对一个包含自定义对象的`List`进行排序。请写出具体的代码示例,包括自定义对象的定义和排序操作的实现。
16.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 自定义对象定义: 假设我们有一个Person类,包含nameage属性。
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 +
                '}';
    }
}
  1. 实现Comparator接口创建自定义比较器
import java.util.Comparator;

class PersonAgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}
  1. 对包含自定义对象的List进行排序操作
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortingExample {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("Alice", 25));
        personList.add(new Person("Bob", 20));
        personList.add(new Person("Charlie", 30));

        Collections.sort(personList, new PersonAgeComparator());

        for (Person person : personList) {
            System.out.println(person);
        }
    }
}

上述代码中:

  • 首先定义了Person类,它有nameage两个属性。
  • 接着创建了PersonAgeComparator类实现Comparator<Person>接口,在compare方法中定义了按年龄比较的逻辑。
  • 最后在main方法中创建了Person对象的List,并使用Collections.sort方法结合自定义比较器PersonAgeComparatorList进行排序,最后打印排序后的结果。

如果想按名字比较,可以如下实现:

class PersonNameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

然后在main方法中使用这个新的比较器进行排序:

Collections.sort(personList, new PersonNameComparator());