método Java compareTo falla

andrecj:

Tengo una clase llamada tarea que quiero conseguir en un PriorityQueue.

Mi clase es comparable por la fecha y un campo booleano llamado isUrgent

 @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);
        }

Primera vez que trabaja con los comparables, cuando quito una tarea de la prioridad de la cola debe ser eliminado antes de la fecha más reciente, pero si es urgente, entonces debe ser eliminado primero tarea urgente.

Pero consigo esto en medio de la eliminación,

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}

¿Qué estoy haciendo mal en el método compareTo?

kaya3:

Lo que parece que quieren es comparar las tareas de urgencia primero, y luego por fecha. En lugar de añadir los resultados de dos comparadores, debe encadenar los resultados, por lo que las fechas de dos tareas sólo si se comparan sus urgencias son los mismos (es decir, ambos son urgentes, o ambos no urgente).

Afortunadamente, la Comparatorclase tiene algunos métodos útiles que hacen que sea fácil para crear un comparador que hace lo que quiere. La mayoría de las veces, incluyendo en su caso de uso, que no tienen que escribir realmente su propio compareTométodo. Se puede utilizar el comparingmétodo de comparar por la urgencia o la fecha, y se puede utilizar thenComparingpara encadenar juntos. El reversedmétodo le permite comparar las urgencias de manera que truese produce antes false.

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

O el uso de referencias de métodos (si su clase tiene métodos getter):

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

A continuación, puede crear una cola de prioridad que utiliza este comparador llamando a la adecuada PriorityQueue constructor :

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=478067&siteId=1
Recomendado
Clasificación