Cola de prioridad de Java

Estoy tratando de implementar PriorityQueue. Esta PriorityQueue va a contener instancias de la clase Task. Estas instancias de Tarea deben organizarse de tal manera que las instancias que tienen mayor "prioridad" estén al principio de la Cola. En resumen, las instancias deben estar en orden descendente de prioridad.

    private static Queue<Task> testQ = new PriorityQueue<Task>(11, new TaskQueueComparator());


    /*** Comparator ***/        
    public class TaskQueueComparator implements Comparator<Task> {

    public int compare(Task task1, Task task2) {
        return task2.priority - task1.priority;
        }        
    }

    /**** Task definition **/       
    public class Task {
        public int priority;
        }


    /**** Code in main() ****/

    Task pe11 = new Task();
    pe11.priority = 3;
    testQ.add(pe11);


    pe11 = new Task();
    pe11.priority = 1;
    testQ.add(pe11);


    pe11 = new Task();
    pe11.priority = 2;
    testQ.add(pe11);


    void displayQueue() {

    int size = testQ.size();

    for (int k = 0; k < size; k++)
    {
        Task p = testQ.poll();
        System.out.format("Task Priority %d \n", p.priority); // The result I am getting is  3 1 2.. I was expecting 3 2 1
    }

Como se muestra en el comentario, esto genera 3,1,2 en lugar de 3,2,1 como esperaba. ¿Puede alguien decirme qué error estoy haciendo aquí? Cada vez que elimino o agrego una tarea de/a la cola, la cola debe organizar las tareas en orden descendente de prioridad.

Házmelo saber.

Gracias Josh

preguntado el 27 de julio de 12 a las 17:07

¿Qué está yendo mal? Dijiste lo que debería hacer, pero ¿qué está haciendo? -

¿Tarea? ¿O hay alguna razón para no usar java.util.PriorityQueue? -

Me dio la impresión de que el OP is usando java.util.PriorityQueue, porque de lo contrario necesitaríamos ver las implementaciones de add() (y probablemente poll()). Si no lo está, necesitamos ver más del código. -

¡Obtengo menos 1 por comprensión de lectura entonces! -

Además, ¿qué sucede si crea todos los elementos de la tarea a la vez? luego ¿insertar? -

2 Respuestas

FYI, PriorityQueue solo devuelve los elementos en orden de prioridad cuando sondea () la cola. Encontré este de la manera difícil cuando me cansé de repetirlo hace mucho tiempo. Además, solo realiza la comparación en la inserción. Entonces, si su prioridad cambia mientras está en la cola, obtendrá un comportamiento muy extraño.

Cambiando su código a lo siguiente:

void displayQueue() {
    while (!testQ.isEmpty())
    {   
    Task p = testQ.poll(); // poll, you want to remove the head
    System.out.format("Task Priority %d \n", p.priority);
    }
}

pude conseguir:

Tarea Prioridad 3

Tarea Prioridad 2

Tarea Prioridad 1

Respondido 27 Jul 12, 17:07

no debería reemplazar peek poll en el código original producen el mismo comportamiento? - dennis meng

peek solo devolverá la cabeza, que es 3. El código original solo muestra 3, 3, 3. - jyro117

soy consciente Por eso pregunté si simplemente cambiando el código original para llamar poll en cambio, también soluciona el problema. - dennis meng

Lo siento, malinterpretado. No lo hará porque la encuesta elimina el elemento y eso reduce el tamaño de la cola. Dado que realiza un bucle en función del tamaño, el tamaño cambiará por iteración. - jyro117

No, porque almacena el tamaño original en una variable local y la usa. - dennis meng

Al principio pensé que su Comparador podría no estar haciendo lo correcto con "ProcessElements", pero parece que fue un error tipográfico.

Esto devuelve "3 3 3" para mí, tal como está ...

¿Quiso decir .poll() y no peek()?

Respondido 27 Jul 12, 17:07

Lo siento, mi mal ... debería ser una encuesta y no un vistazo. - Josh

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.