То, что вы хотите - сначала сравнить задачи по срочности, а затем по дате. Вместо того, чтобы добавлять результаты двух компараторов, вы должны объединить результаты в цепочку, чтобы даты двух задач сравнивались только в том случае, если их срочность одинакова (т. Е. Оба срочны или оба несрочные).
К счастью, класс Comparator
имеет несколько полезных методов, которые облегчают создание компаратора, который делает то, что вы хотите. В большинстве случаев, в том числе в вашем случае использования, вам не нужно на самом деле писать свой собственный метод compareTo
. Вы можете использовать метод comparing
для сравнения по срочности или дате, и вы можете использовать thenComparing
, чтобы связать их вместе. Метод reversed
позволяет сравнивать срочности так, чтобы true
встречался до false
.
Comparator<Task> cmp =
Comparator.comparing(t -> t.isUrgent).reversed().thenComparing(t -> t.date);
Или с использованием ссылок на методы (если в вашем классе есть методы-получатели):
Comparator<Task> cmp =
Comparator.comparing(Task::isUrgent).reversed().thenComparing(Task::getDate);
Затем можно создать очередь приоритетов, которая использует этот компаратор, вызвав соответствующий PriorityQueue
конструктор :
PriorityQueue<Task> queue = new PriorityQueue<>(cmp);