gpt4 book ai didi

Java CompareTo 方法失败

转载 作者:行者123 更新时间:2023-12-02 08:03:04 34 4
gpt4 key购买 nike

我有一个名为任务的类,我想将其放入 PriorityQueue 中。

我的类(class)通过日期和名为isUrgent的 boolean 字段进行比较

 @Override
public int compareTo(Task task) {
int x = 0;
if (!isUrgent && task.isUrgent)
x=1;
else if (isUrgent && !task.isUrgent)
x=-1;
else return date.compareTo(task.date);

return x +date.compareTo(task.date);
}

第一次使用可比对象时,当我从优先级队列中删除任务时,它应该在最近的日期之前删除,但如果它很紧急,那么它应该首先删除紧急任务。

但是我在删除过程中得到了这个,

Task{isUrgent=true, date=Sat Apr 04 00:00:00 BST 2020}
Task{isUrgent=true, date=Sat Apr 04 00:00:00 BST 2020}
Task{isUrgent=false, date=Sat Apr 04 00:00:00 BST 2020}
Task{isUrgent=true, date=Thu Apr 04 00:00:00 BST 2030}
Task{isUrgent=false, date=Sat Apr 04 00:00:00 BST 2020}
Task{isUrgent=true, date=Thu Apr 04 00:00:00 BST 2030}
Task{isUrgent=false, date=Thu Apr 04 00:00:00 BST 2030}
Task{isUrgent=false, date=Thu Apr 04 00:00:00 BST 2030}

我在compareTo方法中做错了什么?

最佳答案

您似乎想要的是首先按紧急程度比较任务,然后按日期比较任务。您不应将两个比较器的结果相加,而应将结果链接起来,以便仅在两个任务的紧急程度相同(即两者都紧急或都不紧急)时才比较两个任务的日期。

幸运的是,Comparator 类有一些有用的方法,可以轻松创建一个执行您想要的操作的比较器。大多数时候,包括在您的用例中,您不需要实际编写自己的 compareTo 方法。您可以使用 comparing按紧急程度或日期进行比较的方法,您可以使用 thenComparing将它们链接在一起。 reversed方法允许您比较紧急程度,以便 true 出现在 false 之前。

Comparator<Task> cmp =
Comparator.comparing(t -> t.isUrgent).reversed().thenComparing(t -> t.date);

或者使用方法引用(如果你的类有 getter 方法):

Comparator<Task> cmp =
Comparator.comparing(Task::isUrgent).reversed().thenComparing(Task::getDate);

然后,您可以通过调用适当的 PriorityQueue constructor 来创建使用此比较器的优先级队列。 :

PriorityQueue<Task> queue = new PriorityQueue<>(cmp);

关于Java CompareTo 方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60067860/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com