MST

星途 面试题库

面试题:Java TreeSet定制排序的多种方式及应用场景

在Java中,TreeSet实现定制排序有哪些方式?请分别举例说明,并阐述每种方式适用的应用场景。比如,在一个存储员工信息的TreeSet中,要求根据员工的年龄和入职时间进行定制排序,该如何实现?
12.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在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接口就可以很方便地实现不同的排序策略。