📅  最后修改于: 2023-12-03 14:49:34.125000             🧑  作者: Mango
在做作业时,我们通常需要按照不同的要求对作业进行排序,例如按照截止日期、难度等等。在 Java 中,可以使用 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 集合中。
for (Task task : tasks) {
System.out.println(task);
}
这里通过 for-each 循环来遍历 tasks 集合,并输出每个元素。
为了让 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 对象。需要注意的是,如果两个对象在第一次比较后相等,才会继续进行第二次比较,以此类推。
在使用 TreeSet 时,我们可以通过构造器或者 setComparator 方法指定 Comparator 接口。
Set<Task> tasks = new TreeSet<>(new TaskComparator());
这里通过传入 TaskComparator 对象来初始化 TreeSet 集合,并实现了对 Task 对象的排序。
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 接口来实现特定的排序方式。