📜  作业排序问题 |第 3 组(在Java中使用 TreeSet)(1)

📅  最后修改于: 2023-12-03 14:49:34.125000             🧑  作者: Mango

作业排序问题 | 第 3 组(在 Java 中使用 TreeSet)

简介

在做作业时,我们通常需要按照不同的要求对作业进行排序,例如按照截止日期、难度等等。在 Java 中,可以使用 TreeSet 来对作业进行排序,它能够自动根据给定的比较器对元素进行排序,并且还支持去重。

TreeSet 的基本使用

首先来看一下如何使用 TreeSet。

创建 TreeSet
Set<Task> tasks = new TreeSet<>();

这里我们创建了一个 Set 集合 tasks,并使用 TreeSet 来实现。这里的 Task 是一个自定义的类,需要实现 Comparator 接口。

添加元素
Task task1 = new Task("task1", "2021-10-01", 3);
Task task2 = new Task("task2", "2021-10-05", 2);
Task task3 = new Task("task3", "2021-09-28", 1);

tasks.add(task1);
tasks.add(task2);
tasks.add(task3);

我们创建了三个 Task 对象,并将它们添加到 tasks 集合中。

遍历 TreeSet
for (Task task : tasks) {
    System.out.println(task);
}

这里通过 for-each 循环来遍历 tasks 集合,并输出每个元素。

实现 Comparator 接口

为了让 TreeSet 能够对 Task 对象进行排序,我们需要实现 Comparator 接口,并实现其中的 compare 方法。

public class TaskComparator implements Comparator<Task> {
    @Override
    public int compare(Task task1, Task task2) {
        int result = task1.getDeadline().compareTo(task2.getDeadline());
        if (result != 0) {
            return result;
        }
        result = task1.getDifficulty() - task2.getDifficulty();
        if (result != 0) {
            return result;
        }
        return task1.getName().compareTo(task2.getName());
    }
}

这里我们实现了自定义的 TaskComparator 类,并实现了其 compare 方法。我们按照先比较截止日期、再比较难度、最后比较名称的方式来比较 Task 对象。需要注意的是,如果两个对象在第一次比较后相等,才会继续进行第二次比较,以此类推。

使用 Comparator 接口排序

在使用 TreeSet 时,我们可以通过构造器或者 setComparator 方法指定 Comparator 接口。

使用构造器指定 Comparator
Set<Task> tasks = new TreeSet<>(new TaskComparator());

这里通过传入 TaskComparator 对象来初始化 TreeSet 集合,并实现了对 Task 对象的排序。

使用 setComparator 方法指定 Comparator
Set<Task> tasks = new TreeSet<>();
tasks.comparator(new TaskComparator());

这里通过调用 setComparator 方法来指定 Comparator 接口,并实现了对 Task 对象的排序。

示例代码

完整的示例代码如下:

import java.util.*;

class Task {
    private String name;
    private String deadline;
    private int difficulty;

    public Task(String name, String deadline, int difficulty) {
        this.name = name;
        this.deadline = deadline;
        this.difficulty = difficulty;
    }

    public String getName() {
        return name;
    }

    public String getDeadline() {
        return deadline;
    }

    public int getDifficulty() {
        return difficulty;
    }

    @Override
    public String toString() {
        return name + " " + deadline + " " + difficulty;
    }
}

class TaskComparator implements Comparator<Task> {
    @Override
    public int compare(Task task1, Task task2) {
        int result = task1.getDeadline().compareTo(task2.getDeadline());
        if (result != 0) {
            return result;
        }
        result = task1.getDifficulty() - task2.getDifficulty();
        if (result != 0) {
            return result;
        }
        return task1.getName().compareTo(task2.getName());
    }
}

public class Main {
    public static void main(String[] args) {
        Set<Task> tasks = new TreeSet<>(new TaskComparator());

        Task task1 = new Task("task1", "2021-10-01", 3);
        Task task2 = new Task("task2", "2021-10-05", 2);
        Task task3 = new Task("task3", "2021-09-28", 1);

        tasks.add(task1);
        tasks.add(task2);
        tasks.add(task3);

        for (Task task : tasks) {
            System.out.println(task);
        }
    }
}
总结

使用 TreeSet 可以实现对作业排序的功能,它能够根据给定的比较器自动对元素进行排序,并且还支持去重。在实际开发中,可以根据具体需求,自定义 Comparator 接口来实现特定的排序方式。