面试题答案
一键面试在Java中,TreeSet实现定制排序有两种方式:
1. 实现Comparable接口
- 实现方式:让元素类实现Comparable接口,并重写compareTo方法。
- 示例:
class Employee implements Comparable<Employee> {
private int age;
private long joinTime;
public Employee(int age, long joinTime) {
this.age = age;
this.joinTime = joinTime;
}
@Override
public int compareTo(Employee other) {
int ageCompare = Integer.compare(this.age, other.age);
if (ageCompare != 0) {
return ageCompare;
}
return Long.compare(this.joinTime, other.joinTime);
}
}
public class Main {
public static void main(String[] args) {
TreeSet<Employee> treeSet = new TreeSet<>();
treeSet.add(new Employee(30, 1600000000L));
treeSet.add(new Employee(25, 1500000000L));
treeSet.add(new Employee(30, 1550000000L));
for (Employee employee : treeSet) {
System.out.println("Age: " + employee.age + ", Join Time: " + employee.joinTime);
}
}
}
- 适用场景:当元素类自身具有自然排序的逻辑,并且这个排序逻辑是比较通用的,在多个地方都可能用到时适用。比如在这个员工信息的例子中,如果大多数情况下都需要按照年龄和入职时间来排序员工信息,就适合使用这种方式。
2. 使用Comparator接口
- 实现方式:创建一个实现Comparator接口的类,并重写compare方法,然后在创建TreeSet时将该Comparator实例作为参数传入。
- 示例:
class Employee {
private int age;
private long joinTime;
public Employee(int age, long joinTime) {
this.age = age;
this.joinTime = joinTime;
}
}
class EmployeeComparator implements Comparator<Employee> {
@Override
public int compare(Employee e1, Employee e2) {
int ageCompare = Integer.compare(e1.age, e2.age);
if (ageCompare != 0) {
return ageCompare;
}
return Long.compare(e1.joinTime, e2.joinTime);
}
}
public class Main {
public static void main(String[] args) {
TreeSet<Employee> treeSet = new TreeSet<>(new EmployeeComparator());
treeSet.add(new Employee(30, 1600000000L));
treeSet.add(new Employee(25, 1500000000L));
treeSet.add(new Employee(30, 1550000000L));
for (Employee employee : treeSet) {
System.out.println("Age: " + employee.age + ", Join Time: " + employee.joinTime);
}
}
}
- 适用场景:当元素类不适合或者不方便修改来实现Comparable接口,或者针对同一个元素类,在不同的场景下需要不同的排序逻辑时适用。例如,如果在某些情况下需要按照员工年龄排序,而在其他情况下需要按照入职时间排序,使用Comparator接口就可以很方便地实现不同的排序策略。